a[] = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
cft1st(n = 256);
  // computes first 16 (8 complexes) manually
  l=2 btrfly(j=16, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={16,17}, b={18,19}, c={20,21}, d={22,23}
  l=2 btrfly(j+8=16+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={24,25}, b={26,27}, c={28,29}, d={30,31}
  l=2 btrfly(j=32, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={32,33}, b={34,35}, c={36,37}, d={38,39}
  l=2 btrfly(j+8=32+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={40,41}, b={42,43}, c={44,45}, d={46,47}
  l=2 btrfly(j=48, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={48,49}, b={50,51}, c={52,53}, d={54,55}
  l=2 btrfly(j+8=48+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={56,57}, b={58,59}, c={60,61}, d={62,63}
  l=2 btrfly(j=64, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={64,65}, b={66,67}, c={68,69}, d={70,71}
  l=2 btrfly(j+8=64+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={72,73}, b={74,75}, c={76,77}, d={78,79}
  l=2 btrfly(j=80, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={80,81}, b={82,83}, c={84,85}, d={86,87}
  l=2 btrfly(j+8=80+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={88,89}, b={90,91}, c={92,93}, d={94,95}
  l=2 btrfly(j=96, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={96,97}, b={98,99}, c={100,101}, d={102,103}
  l=2 btrfly(j+8=96+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={104,105}, b={106,107}, c={108,109}, d={110,111}
  l=2 btrfly(j=112, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={112,113}, b={114,115}, c={116,117}, d={118,119}
  l=2 btrfly(j+8=112+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={120,121}, b={122,123}, c={124,125}, d={126,127}
  l=2 btrfly(j=128, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={128,129}, b={130,131}, c={132,133}, d={134,135}
  l=2 btrfly(j+8=128+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={136,137}, b={138,139}, c={140,141}, d={142,143}
  l=2 btrfly(j=144, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={144,145}, b={146,147}, c={148,149}, d={150,151}
  l=2 btrfly(j+8=144+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={152,153}, b={154,155}, c={156,157}, d={158,159}
  l=2 btrfly(j=160, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={160,161}, b={162,163}, c={164,165}, d={166,167}
  l=2 btrfly(j+8=160+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={168,169}, b={170,171}, c={172,173}, d={174,175}
  l=2 btrfly(j=176, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={176,177}, b={178,179}, c={180,181}, d={182,183}
  l=2 btrfly(j+8=176+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={184,185}, b={186,187}, c={188,189}, d={190,191}
  l=2 btrfly(j=192, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={192,193}, b={194,195}, c={196,197}, d={198,199}
  l=2 btrfly(j+8=192+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={200,201}, b={202,203}, c={204,205}, d={206,207}
  l=2 btrfly(j=208, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={208,209}, b={210,211}, c={212,213}, d={214,215}
  l=2 btrfly(j+8=208+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={216,217}, b={218,219}, c={220,221}, d={222,223}
  l=2 btrfly(j=224, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={224,225}, b={226,227}, c={228,229}, d={230,231}
  l=2 btrfly(j+8=224+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={232,233}, b={234,235}, c={236,237}, d={238,239}
  l=2 btrfly(j=240, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={240,241}, b={242,243}, c={244,245}, d={246,247}
  l=2 btrfly(j+8=240+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={248,249}, b={250,251}, c={252,253}, d={254,255}
i=4  cftmd2(n=256, l=8, a, w)
  cftmd0(n=256, l=8, a, w)
    l=8 btrfly(j=0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={0,1}, b={8,9}, c={16,17}, d={24,25}
    l=8 btrfly(j=2, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={2,3}, b={10,11}, c={18,19}, d={26,27}
    l=8 btrfly(j=4, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={4,5}, b={12,13}, c={20,21}, d={28,29}
    l=8 btrfly(j=6, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={6,7}, b={14,15}, c={22,23}, d={30,31}
    l=8 btrfly(j=32, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={32,33}, b={40,41}, c={48,49}, d={56,57}
    l=8 btrfly(j=34, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={34,35}, b={42,43}, c={50,51}, d={58,59}
    l=8 btrfly(j=36, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={36,37}, b={44,45}, c={52,53}, d={60,61}
    l=8 btrfly(j=38, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={38,39}, b={46,47}, c={54,55}, d={62,63}
  cftmd21(n=256, l=8, a, w)
  l=8 btrfly(j=64, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={64,65}, b={72,73}, c={80,81}, d={88,89}
  l=8 btrfly(j=66, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={66,67}, b={74,75}, c={82,83}, d={90,91}
  l=8 btrfly(j=68, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={68,69}, b={76,77}, c={84,85}, d={92,93}
  l=8 btrfly(j=70, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={70,71}, b={78,79}, c={86,87}, d={94,95}
  l=8 btrfly(j+8=96+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={96,97}, b={104,105}, c={112,113}, d={120,121}
  l=8 btrfly(j+8=98+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={98,99}, b={106,107}, c={114,115}, d={122,123}
  l=8 btrfly(j+8=100+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={100,101}, b={108,109}, c={116,117}, d={124,125}
  l=8 btrfly(j+8=102+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={102,103}, b={110,111}, c={118,119}, d={126,127}
  l=8 btrfly(j=128, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={128,129}, b={136,137}, c={144,145}, d={152,153}
  l=8 btrfly(j=130, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={130,131}, b={138,139}, c={146,147}, d={154,155}
  l=8 btrfly(j=132, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={132,133}, b={140,141}, c={148,149}, d={156,157}
  l=8 btrfly(j=134, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={134,135}, b={142,143}, c={150,151}, d={158,159}
  l=8 btrfly(j+8=160+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={160,161}, b={168,169}, c={176,177}, d={184,185}
  l=8 btrfly(j+8=162+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={162,163}, b={170,171}, c={178,179}, d={186,187}
  l=8 btrfly(j+8=164+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={164,165}, b={172,173}, c={180,181}, d={188,189}
  l=8 btrfly(j+8=166+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={166,167}, b={174,175}, c={182,183}, d={190,191}
  l=8 btrfly(j=192, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={192,193}, b={200,201}, c={208,209}, d={216,217}
  l=8 btrfly(j=194, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={194,195}, b={202,203}, c={210,211}, d={218,219}
  l=8 btrfly(j=196, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={196,197}, b={204,205}, c={212,213}, d={220,221}
  l=8 btrfly(j=198, wk1r=0, wk1i=0, wk2r=0, wk2i=0, wk3r=0, wk3i=0, a, b, c, d);
        a={198,199}, b={206,207}, c={214,215}, d={222,223}
  l=8 btrfly(j+8=224+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={224,225}, b={232,233}, c={240,241}, d={248,249}
  l=8 btrfly(j+8=226+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={226,227}, b={234,235}, c={242,243}, d={250,251}
  l=8 btrfly(j+8=228+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={228,229}, b={236,237}, c={244,245}, d={252,253}
  l=8 btrfly(j+8=230+8, wk1r=0, wk1i=0, -wk2i=-0, wk2r=0, wk3r=0, wk3i=0, a, b, c, d);
        a={230,231}, b={238,239}, c={246,247}, d={254,255}
i=6  cftmd2(n=256, l=32, a, w)
  cftmd0(n=256, l=32, a, w)
    l=32 btrfly(j=0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={0,1}, b={32,33}, c={64,65}, d={96,97}
    l=32 btrfly(j=2, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={2,3}, b={34,35}, c={66,67}, d={98,99}
    l=32 btrfly(j=4, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={4,5}, b={36,37}, c={68,69}, d={100,101}
    l=32 btrfly(j=6, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={6,7}, b={38,39}, c={70,71}, d={102,103}
    l=32 btrfly(j=8, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={8,9}, b={40,41}, c={72,73}, d={104,105}
    l=32 btrfly(j=10, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={10,11}, b={42,43}, c={74,75}, d={106,107}
    l=32 btrfly(j=12, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={12,13}, b={44,45}, c={76,77}, d={108,109}
    l=32 btrfly(j=14, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={14,15}, b={46,47}, c={78,79}, d={110,111}
    l=32 btrfly(j=16, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={16,17}, b={48,49}, c={80,81}, d={112,113}
    l=32 btrfly(j=18, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={18,19}, b={50,51}, c={82,83}, d={114,115}
    l=32 btrfly(j=20, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={20,21}, b={52,53}, c={84,85}, d={116,117}
    l=32 btrfly(j=22, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={22,23}, b={54,55}, c={86,87}, d={118,119}
    l=32 btrfly(j=24, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={24,25}, b={56,57}, c={88,89}, d={120,121}
    l=32 btrfly(j=26, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={26,27}, b={58,59}, c={90,91}, d={122,123}
    l=32 btrfly(j=28, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={28,29}, b={60,61}, c={92,93}, d={124,125}
    l=32 btrfly(j=30, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, a, b, c, d)
        a={30,31}, b={62,63}, c={94,95}, d={126,127}
    l=32 btrfly(j=128, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={128,129}, b={160,161}, c={192,193}, d={224,225}
    l=32 btrfly(j=130, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={130,131}, b={162,163}, c={194,195}, d={226,227}
    l=32 btrfly(j=132, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={132,133}, b={164,165}, c={196,197}, d={228,229}
    l=32 btrfly(j=134, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={134,135}, b={166,167}, c={198,199}, d={230,231}
    l=32 btrfly(j=136, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={136,137}, b={168,169}, c={200,201}, d={232,233}
    l=32 btrfly(j=138, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={138,139}, b={170,171}, c={202,203}, d={234,235}
    l=32 btrfly(j=140, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={140,141}, b={172,173}, c={204,205}, d={236,237}
    l=32 btrfly(j=142, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={142,143}, b={174,175}, c={206,207}, d={238,239}
    l=32 btrfly(j=144, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={144,145}, b={176,177}, c={208,209}, d={240,241}
    l=32 btrfly(j=146, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={146,147}, b={178,179}, c={210,211}, d={242,243}
    l=32 btrfly(j=148, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={148,149}, b={180,181}, c={212,213}, d={244,245}
    l=32 btrfly(j=150, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={150,151}, b={182,183}, c={214,215}, d={246,247}
    l=32 btrfly(j=152, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={152,153}, b={184,185}, c={216,217}, d={248,249}
    l=32 btrfly(j=154, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={154,155}, b={186,187}, c={218,219}, d={250,251}
    l=32 btrfly(j=156, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={156,157}, b={188,189}, c={220,221}, d={252,253}
    l=32 btrfly(j=158, wk1r=0, wk1r=0, 0.0, 1.0, -wk1r=-0, wk1r=0, a, b, c, d)
        a={158,159}, b={190,191}, c={222,223}, d={254,255}
l << 2 != n
