%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
%%            http://www.iis.ee.ethz.ch/~sha3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y = NTT(M, f)

y = zeros(1,128);
y(1:64) = M;

FFT64_8_8_Twiddle = [
    1,    1,    1,    1,    1,    1,    1,    1;
    1,    2,    4,    8,   16,   32,   64,  128;
    1,   60,    2,  120,    4,  -17,    8,  -34;
    1,  120,    8,  -68,   64,  -30,   -2,   17; 
    1,   46,   60,  -67,    2,   92,  120,  123; 
    1,   92,  -17,  -22,   32,  117,  -30,   67; 
    1,  -67,  120,  -73,    8,  -22,  -68,  -70; 
    1,  123,  -34,  -70,  128,   67,   17,   35];

FFT128_2_64_Twiddle =  [
    1, -118,   46,  -31,   60,  116,  -67,  -61, ...
    2,   21,   92,  -62,  120,  -25,  123, -122, ...
    4,   42,  -73, -124,  -17,  -50,  -11,   13, ...
    8,   84,  111,    9,  -34, -100,  -22,   26, ...
   16,  -89,  -35,   18,  -68,   57,  -44,   52, ...
   32,   79,  -70,   36,  121,  114,  -88,  104, ...
   64,  -99,  117,   72,  -15,  -29,   81,  -49, ...
  128,   59,  -23, -113,  -30,  -58,  -95,  -98];





P = [1
 65
 33
 97
 17
 81
 49
113
  9
 73
 41
105
 25
 89
 57
121
  5
 69
 37
101
 21
 85
 53
117
 13
 77
 45
109
 29
 93
 61
125
  3
 67
 35
 99
 19
 83
 51
115
 11
 75
 43
107
 27
 91
 59
123
  7
 71
 39
103
 23
 87
 55
119
 15
 79
 47
111
 31
 95
 63
127
  2
 66
 34
 98
 18
 82
 50
114
 10
 74
 42
106
 26
 90
 58
122
  6
 70
 38
102
 22
 86
 54
118
 14
 78
 46
110
 30
 94
 62
126
  4
 68
 36
100
 20
 84
 52
116
 12
 76
 44
108
 28
 92
 60
124
  8
 72
 40
104
 24
 88
 56
120
 16
 80
 48
112
 32
 96
 64
128];

Pf = [
  1
 65
 33
 97
 17
 81
 49
113
  9
 73
 41
105
 25
 89
 57
121
  5
 69
 37
101
 21
 85
 53
117
 13
 77
 45
109
 29
 93
 61
125
  3
 67
 35
 99
 19
 83
 51
115
 11
 75
 43
107
 27
 91
 59
123
  7
 71
 39
103
 23
 87
 55
119
 15
 79
 47
111
 31
 95
 63
127
  2
 66
 34
 98
 18
 82
 50
114
 10
 74
 42
106
 26
 90
 58
122
  6
 70
 38
102
 22
 86
 54
118
 14
 78
 46
110
 30
 94
 62
126
  4
 68
 36
100
 20
 84
 52
116
 12
 76
 44
108
 28
 92
 60
124
  8
 72
 40
104
 24
 88
 56
120
 16
 80
 48
112
 32
 96
 64
128];

yo = y;

tmp = y(64);

for i=0:62,
    y(64+i+1) = reduce(y(i+1) * FFT128_2_64_Twiddle(i+1));
end

if f == 1,
  tmp2 = y(62);
  y(62)  = reduce(tmp2 + 1);
  y(126) = reduce((tmp2 - 1) * FFT128_2_64_Twiddle(62));
end

y(63+1)  = reduce(tmp + 1);
y(127+1) = reduce((tmp - 1) * FFT128_2_64_Twiddle(63+1));

ym = zeros(16,8);
for i = 1:16,
    ym(i,1:8) = int16(y(i*8-8+[1:8]));
end

% first -------------------------------------------------------------------

for i=0:7,
    ym(:,i+1) = FFT_8(ym(:,i+1));
end
    
for i=1:8
    for j = 1:8,
        ym(i,j) = reduce(ym(i,j)*FFT64_8_8_Twiddle(i,j));
    end
end

for i=0:7,
    ym(i+1,:) = FFT_8(ym(i+1,:));
end

% Second ------------------------------------------------------------------

for i=0:7,
    ym(9:end,i+1) = FFT_8(ym(9:end,i+1));
end
    
for i=1:8
    for j = 1:8,
        ym(8+i,j) = reduce(ym(8+i,j)*FFT64_8_8_Twiddle(i,j));
    end
end

for i=0:7,
    ym(i+9,:) = FFT_8(ym(i+9,:));
end


y2 = [ym(1,:) ym(2,:) ym(3,:) ym(4,:) ...
     ym(5,:) ym(6,:) ym(7,:) ym(8,:) ...
     ym(9,:) ym(10,:) ym(11,:) ym(12,:) ...
     ym(13,:) ym(14,:) ym(15,:) ym(16,:)];
 
% 
    y = y2(P(1:128));
%  else
%      y = y2(Pf(1:128));
%  end

Generated on Fri Sep 24 10:39:12 CEST 2010
Home