function y = fft113(x,u,ip,op)
% y = fft113(x,u,ip,op)
% y  : the 113 point DFT of x 
% u  : a vector of precomputed multiplicative constants
% ip : input permutation
% op : ouput permutation

y = zeros(113,1);
x = x(ip);                                        % input permutation
x(2:113) = KRED([2,7],[4,1],2,x(2:113));          % reduction operations
y(1) = x(1)+x(2);                                 % DC term calculation
% -------------------- block : 1 -------------------------------------------------
y(2) = x(2)*u(1);                       
% -------------------- block : 2 -------------------------------------------------
y(3) = x(3)*u(2);                       
% -------------------- block : 4 -------------------------------------------------
v = ID2I(1,1,x(4:5));              % v = (I(1) kron D2 kron I(1)) * x(4:5)
v = v.*u(3:5);                          
y(4:5) = ID2tI(1,1,v);             % y(4:5) = (I(1) kron D2' kron I(1)) * v
% -------------------- block : 8 -------------------------------------------------
v = ID2I(1,2,x(6:9));              % v = (I(1) kron D2 kron I(2)) * x(6:9)
v = ID2I(3,1,v);                   % v = (I(3) kron D2 kron I(1)) * v
v = v.*u(6:14);                         
v = ID2tI(1,3,v);                  % v = (I(1) kron D2' kron I(3)) * v
y(6:9) = ID2tI(2,1,v);             % y(6:9) = (I(2) kron D2' kron I(1)) * v
% -------------------- block : 16 ------------------------------------------------
v = ID2I(1,4,x(10:17));            % v = (I(1) kron D2 kron I(4)) * x(10:17)
v = ID2I(3,2,v);                   % v = (I(3) kron D2 kron I(2)) * v
v = ID2I(9,1,v);                   % v = (I(9) kron D2 kron I(1)) * v
v = v.*u(15:41);                        
v = ID2tI(1,9,v);                  % v = (I(1) kron D2' kron I(9)) * v
v = ID2tI(2,3,v);                  % v = (I(2) kron D2' kron I(3)) * v
y(10:17) = ID2tI(4,1,v);           % y(10:17) = (I(4) kron D2' kron I(1)) * v
% -------------------- block : 7 -------------------------------------------------
v = ID3I(2,1,x(18:23));            % v = (I(2) kron D3 kron I(1)) * x(18:23)
v = ID2I(1,5,v);                   % v = (I(1) kron D2 kron I(5)) * v
v = v.*u(42:56);                        
v = ID2tI(1,5,v);                  % v = (I(1) kron D2' kron I(5)) * v
y(18:23) = ID3tI(2,1,v);           % y(18:23) = (I(2) kron D3' kron I(1)) * v
% -------------------- block : 14 = 2 * 7 ----------------------------------------
v = ID3I(2,1,x(24:29));            % v = (I(2) kron D3 kron I(1)) * x(24:29)
v = ID2I(1,5,v);                   % v = (I(1) kron D2 kron I(5)) * v
v = v.*u(57:71);                        
v = ID2tI(1,5,v);                  % v = (I(1) kron D2' kron I(5)) * v
y(24:29) = ID3tI(2,1,v);           % y(24:29) = (I(2) kron D3' kron I(1)) * v
% -------------------- block : 28 = 4 * 7 ----------------------------------------
v = ID3I(4,1,x(30:41));            % v = (I(4) kron D3 kron I(1)) * x(30:41)
v = ID2I(1,10,v);                  % v = (I(1) kron D2 kron I(10)) * v
v = ID2I(3,5,v);                   % v = (I(3) kron D2 kron I(5)) * v
v = v.*u(72:116);                       
v = ID2tI(1,15,v);                 % v = (I(1) kron D2' kron I(15)) * v
v = ID2tI(2,5,v);                  % v = (I(2) kron D2' kron I(5)) * v
y(30:41) = ID3tI(4,1,v);           % y(30:41) = (I(4) kron D3' kron I(1)) * v
% -------------------- block : 56 = 8 * 7 ----------------------------------------
v = ID3I(8,1,x(42:65));            % v = (I(8) kron D3 kron I(1)) * x(42:65)
v = ID2I(1,20,v);                  % v = (I(1) kron D2 kron I(20)) * v
v = ID2I(3,10,v);                  % v = (I(3) kron D2 kron I(10)) * v
v = ID2I(9,5,v);                   % v = (I(9) kron D2 kron I(5)) * v
v = v.*u(117:251);                      
v = ID2tI(1,45,v);                 % v = (I(1) kron D2' kron I(45)) * v
v = ID2tI(2,15,v);                 % v = (I(2) kron D2' kron I(15)) * v
v = ID2tI(4,5,v);                  % v = (I(4) kron D2' kron I(5)) * v
y(42:65) = ID3tI(8,1,v);           % y(42:65) = (I(8) kron D3' kron I(1)) * v
% -------------------- block : 112 = 16 * 7 --------------------------------------
v = ID3I(16,1,x(66:113));          % v = (I(16) kron D3 kron I(1)) * x(66:113)
v = ID2I(1,40,v);                  % v = (I(1) kron D2 kron I(40)) * v
v = ID2I(3,20,v);                  % v = (I(3) kron D2 kron I(20)) * v
v = ID2I(9,10,v);                  % v = (I(9) kron D2 kron I(10)) * v
v = ID2I(27,5,v);                  % v = (I(27) kron D2 kron I(5)) * v
v = v.*u(252:656);                      
v = ID2tI(1,135,v);                % v = (I(1) kron D2' kron I(135)) * v
v = ID2tI(2,45,v);                 % v = (I(2) kron D2' kron I(45)) * v
v = ID2tI(4,15,v);                 % v = (I(4) kron D2' kron I(15)) * v
v = ID2tI(8,5,v);                  % v = (I(8) kron D2' kron I(5)) * v
y(66:113) = ID3tI(16,1,v);         % y(66:113) = (I(16) kron D3' kron I(1)) * v
% --------------------------------------------------------------------------------
y(2) = y(1)+y(2);                                 % DC term calculation
y(2:113) = tKRED([2,7],[4,1],2,y(2:113));         % transpose reduction operations
y = y(op);                                        % output permutation

% For complex data - 
% Total Number of Real Multiplications : 1312
% Total Number of Real Additions: 5516

