github.com/consensys/gnark-crypto@v0.14.0/ecc/bls12-377/fr/sis/sis_fft.go (about) 1 // Copyright 2020 Consensys Software Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Code generated by consensys/gnark-crypto DO NOT EDIT 16 17 package sis 18 19 import ( 20 "github.com/consensys/gnark-crypto/ecc/bls12-377/fr" 21 "math/big" 22 ) 23 24 // FFT64 is generated by gnark-crypto and contains the unrolled code for FFT (DIF) on 64 elements 25 // equivalent code: r.Domain.FFT(k, fft.DIF, fft.OnCoset(), fft.WithNbTasks(1)) 26 // twiddlesCoset must be pre-computed from twiddles and coset table, see PrecomputeTwiddlesCoset 27 func FFT64(a []fr.Element, twiddlesCoset []fr.Element) { 28 29 a[32].Mul(&a[32], &twiddlesCoset[0]) 30 a[33].Mul(&a[33], &twiddlesCoset[0]) 31 a[34].Mul(&a[34], &twiddlesCoset[0]) 32 a[35].Mul(&a[35], &twiddlesCoset[0]) 33 a[36].Mul(&a[36], &twiddlesCoset[0]) 34 a[37].Mul(&a[37], &twiddlesCoset[0]) 35 a[38].Mul(&a[38], &twiddlesCoset[0]) 36 a[39].Mul(&a[39], &twiddlesCoset[0]) 37 a[40].Mul(&a[40], &twiddlesCoset[0]) 38 a[41].Mul(&a[41], &twiddlesCoset[0]) 39 a[42].Mul(&a[42], &twiddlesCoset[0]) 40 a[43].Mul(&a[43], &twiddlesCoset[0]) 41 a[44].Mul(&a[44], &twiddlesCoset[0]) 42 a[45].Mul(&a[45], &twiddlesCoset[0]) 43 a[46].Mul(&a[46], &twiddlesCoset[0]) 44 a[47].Mul(&a[47], &twiddlesCoset[0]) 45 a[48].Mul(&a[48], &twiddlesCoset[0]) 46 a[49].Mul(&a[49], &twiddlesCoset[0]) 47 a[50].Mul(&a[50], &twiddlesCoset[0]) 48 a[51].Mul(&a[51], &twiddlesCoset[0]) 49 a[52].Mul(&a[52], &twiddlesCoset[0]) 50 a[53].Mul(&a[53], &twiddlesCoset[0]) 51 a[54].Mul(&a[54], &twiddlesCoset[0]) 52 a[55].Mul(&a[55], &twiddlesCoset[0]) 53 a[56].Mul(&a[56], &twiddlesCoset[0]) 54 a[57].Mul(&a[57], &twiddlesCoset[0]) 55 a[58].Mul(&a[58], &twiddlesCoset[0]) 56 a[59].Mul(&a[59], &twiddlesCoset[0]) 57 a[60].Mul(&a[60], &twiddlesCoset[0]) 58 a[61].Mul(&a[61], &twiddlesCoset[0]) 59 a[62].Mul(&a[62], &twiddlesCoset[0]) 60 a[63].Mul(&a[63], &twiddlesCoset[0]) 61 fr.Butterfly(&a[0], &a[32]) 62 fr.Butterfly(&a[1], &a[33]) 63 fr.Butterfly(&a[2], &a[34]) 64 fr.Butterfly(&a[3], &a[35]) 65 fr.Butterfly(&a[4], &a[36]) 66 fr.Butterfly(&a[5], &a[37]) 67 fr.Butterfly(&a[6], &a[38]) 68 fr.Butterfly(&a[7], &a[39]) 69 fr.Butterfly(&a[8], &a[40]) 70 fr.Butterfly(&a[9], &a[41]) 71 fr.Butterfly(&a[10], &a[42]) 72 fr.Butterfly(&a[11], &a[43]) 73 fr.Butterfly(&a[12], &a[44]) 74 fr.Butterfly(&a[13], &a[45]) 75 fr.Butterfly(&a[14], &a[46]) 76 fr.Butterfly(&a[15], &a[47]) 77 fr.Butterfly(&a[16], &a[48]) 78 fr.Butterfly(&a[17], &a[49]) 79 fr.Butterfly(&a[18], &a[50]) 80 fr.Butterfly(&a[19], &a[51]) 81 fr.Butterfly(&a[20], &a[52]) 82 fr.Butterfly(&a[21], &a[53]) 83 fr.Butterfly(&a[22], &a[54]) 84 fr.Butterfly(&a[23], &a[55]) 85 fr.Butterfly(&a[24], &a[56]) 86 fr.Butterfly(&a[25], &a[57]) 87 fr.Butterfly(&a[26], &a[58]) 88 fr.Butterfly(&a[27], &a[59]) 89 fr.Butterfly(&a[28], &a[60]) 90 fr.Butterfly(&a[29], &a[61]) 91 fr.Butterfly(&a[30], &a[62]) 92 fr.Butterfly(&a[31], &a[63]) 93 a[16].Mul(&a[16], &twiddlesCoset[1]) 94 a[17].Mul(&a[17], &twiddlesCoset[1]) 95 a[18].Mul(&a[18], &twiddlesCoset[1]) 96 a[19].Mul(&a[19], &twiddlesCoset[1]) 97 a[20].Mul(&a[20], &twiddlesCoset[1]) 98 a[21].Mul(&a[21], &twiddlesCoset[1]) 99 a[22].Mul(&a[22], &twiddlesCoset[1]) 100 a[23].Mul(&a[23], &twiddlesCoset[1]) 101 a[24].Mul(&a[24], &twiddlesCoset[1]) 102 a[25].Mul(&a[25], &twiddlesCoset[1]) 103 a[26].Mul(&a[26], &twiddlesCoset[1]) 104 a[27].Mul(&a[27], &twiddlesCoset[1]) 105 a[28].Mul(&a[28], &twiddlesCoset[1]) 106 a[29].Mul(&a[29], &twiddlesCoset[1]) 107 a[30].Mul(&a[30], &twiddlesCoset[1]) 108 a[31].Mul(&a[31], &twiddlesCoset[1]) 109 a[48].Mul(&a[48], &twiddlesCoset[2]) 110 a[49].Mul(&a[49], &twiddlesCoset[2]) 111 a[50].Mul(&a[50], &twiddlesCoset[2]) 112 a[51].Mul(&a[51], &twiddlesCoset[2]) 113 a[52].Mul(&a[52], &twiddlesCoset[2]) 114 a[53].Mul(&a[53], &twiddlesCoset[2]) 115 a[54].Mul(&a[54], &twiddlesCoset[2]) 116 a[55].Mul(&a[55], &twiddlesCoset[2]) 117 a[56].Mul(&a[56], &twiddlesCoset[2]) 118 a[57].Mul(&a[57], &twiddlesCoset[2]) 119 a[58].Mul(&a[58], &twiddlesCoset[2]) 120 a[59].Mul(&a[59], &twiddlesCoset[2]) 121 a[60].Mul(&a[60], &twiddlesCoset[2]) 122 a[61].Mul(&a[61], &twiddlesCoset[2]) 123 a[62].Mul(&a[62], &twiddlesCoset[2]) 124 a[63].Mul(&a[63], &twiddlesCoset[2]) 125 fr.Butterfly(&a[0], &a[16]) 126 fr.Butterfly(&a[1], &a[17]) 127 fr.Butterfly(&a[2], &a[18]) 128 fr.Butterfly(&a[3], &a[19]) 129 fr.Butterfly(&a[4], &a[20]) 130 fr.Butterfly(&a[5], &a[21]) 131 fr.Butterfly(&a[6], &a[22]) 132 fr.Butterfly(&a[7], &a[23]) 133 fr.Butterfly(&a[8], &a[24]) 134 fr.Butterfly(&a[9], &a[25]) 135 fr.Butterfly(&a[10], &a[26]) 136 fr.Butterfly(&a[11], &a[27]) 137 fr.Butterfly(&a[12], &a[28]) 138 fr.Butterfly(&a[13], &a[29]) 139 fr.Butterfly(&a[14], &a[30]) 140 fr.Butterfly(&a[15], &a[31]) 141 fr.Butterfly(&a[32], &a[48]) 142 fr.Butterfly(&a[33], &a[49]) 143 fr.Butterfly(&a[34], &a[50]) 144 fr.Butterfly(&a[35], &a[51]) 145 fr.Butterfly(&a[36], &a[52]) 146 fr.Butterfly(&a[37], &a[53]) 147 fr.Butterfly(&a[38], &a[54]) 148 fr.Butterfly(&a[39], &a[55]) 149 fr.Butterfly(&a[40], &a[56]) 150 fr.Butterfly(&a[41], &a[57]) 151 fr.Butterfly(&a[42], &a[58]) 152 fr.Butterfly(&a[43], &a[59]) 153 fr.Butterfly(&a[44], &a[60]) 154 fr.Butterfly(&a[45], &a[61]) 155 fr.Butterfly(&a[46], &a[62]) 156 fr.Butterfly(&a[47], &a[63]) 157 a[8].Mul(&a[8], &twiddlesCoset[3]) 158 a[9].Mul(&a[9], &twiddlesCoset[3]) 159 a[10].Mul(&a[10], &twiddlesCoset[3]) 160 a[11].Mul(&a[11], &twiddlesCoset[3]) 161 a[12].Mul(&a[12], &twiddlesCoset[3]) 162 a[13].Mul(&a[13], &twiddlesCoset[3]) 163 a[14].Mul(&a[14], &twiddlesCoset[3]) 164 a[15].Mul(&a[15], &twiddlesCoset[3]) 165 a[24].Mul(&a[24], &twiddlesCoset[4]) 166 a[25].Mul(&a[25], &twiddlesCoset[4]) 167 a[26].Mul(&a[26], &twiddlesCoset[4]) 168 a[27].Mul(&a[27], &twiddlesCoset[4]) 169 a[28].Mul(&a[28], &twiddlesCoset[4]) 170 a[29].Mul(&a[29], &twiddlesCoset[4]) 171 a[30].Mul(&a[30], &twiddlesCoset[4]) 172 a[31].Mul(&a[31], &twiddlesCoset[4]) 173 a[40].Mul(&a[40], &twiddlesCoset[5]) 174 a[41].Mul(&a[41], &twiddlesCoset[5]) 175 a[42].Mul(&a[42], &twiddlesCoset[5]) 176 a[43].Mul(&a[43], &twiddlesCoset[5]) 177 a[44].Mul(&a[44], &twiddlesCoset[5]) 178 a[45].Mul(&a[45], &twiddlesCoset[5]) 179 a[46].Mul(&a[46], &twiddlesCoset[5]) 180 a[47].Mul(&a[47], &twiddlesCoset[5]) 181 a[56].Mul(&a[56], &twiddlesCoset[6]) 182 a[57].Mul(&a[57], &twiddlesCoset[6]) 183 a[58].Mul(&a[58], &twiddlesCoset[6]) 184 a[59].Mul(&a[59], &twiddlesCoset[6]) 185 a[60].Mul(&a[60], &twiddlesCoset[6]) 186 a[61].Mul(&a[61], &twiddlesCoset[6]) 187 a[62].Mul(&a[62], &twiddlesCoset[6]) 188 a[63].Mul(&a[63], &twiddlesCoset[6]) 189 fr.Butterfly(&a[0], &a[8]) 190 fr.Butterfly(&a[1], &a[9]) 191 fr.Butterfly(&a[2], &a[10]) 192 fr.Butterfly(&a[3], &a[11]) 193 fr.Butterfly(&a[4], &a[12]) 194 fr.Butterfly(&a[5], &a[13]) 195 fr.Butterfly(&a[6], &a[14]) 196 fr.Butterfly(&a[7], &a[15]) 197 fr.Butterfly(&a[16], &a[24]) 198 fr.Butterfly(&a[17], &a[25]) 199 fr.Butterfly(&a[18], &a[26]) 200 fr.Butterfly(&a[19], &a[27]) 201 fr.Butterfly(&a[20], &a[28]) 202 fr.Butterfly(&a[21], &a[29]) 203 fr.Butterfly(&a[22], &a[30]) 204 fr.Butterfly(&a[23], &a[31]) 205 fr.Butterfly(&a[32], &a[40]) 206 fr.Butterfly(&a[33], &a[41]) 207 fr.Butterfly(&a[34], &a[42]) 208 fr.Butterfly(&a[35], &a[43]) 209 fr.Butterfly(&a[36], &a[44]) 210 fr.Butterfly(&a[37], &a[45]) 211 fr.Butterfly(&a[38], &a[46]) 212 fr.Butterfly(&a[39], &a[47]) 213 fr.Butterfly(&a[48], &a[56]) 214 fr.Butterfly(&a[49], &a[57]) 215 fr.Butterfly(&a[50], &a[58]) 216 fr.Butterfly(&a[51], &a[59]) 217 fr.Butterfly(&a[52], &a[60]) 218 fr.Butterfly(&a[53], &a[61]) 219 fr.Butterfly(&a[54], &a[62]) 220 fr.Butterfly(&a[55], &a[63]) 221 a[4].Mul(&a[4], &twiddlesCoset[7]) 222 a[5].Mul(&a[5], &twiddlesCoset[7]) 223 a[6].Mul(&a[6], &twiddlesCoset[7]) 224 a[7].Mul(&a[7], &twiddlesCoset[7]) 225 a[12].Mul(&a[12], &twiddlesCoset[8]) 226 a[13].Mul(&a[13], &twiddlesCoset[8]) 227 a[14].Mul(&a[14], &twiddlesCoset[8]) 228 a[15].Mul(&a[15], &twiddlesCoset[8]) 229 a[20].Mul(&a[20], &twiddlesCoset[9]) 230 a[21].Mul(&a[21], &twiddlesCoset[9]) 231 a[22].Mul(&a[22], &twiddlesCoset[9]) 232 a[23].Mul(&a[23], &twiddlesCoset[9]) 233 a[28].Mul(&a[28], &twiddlesCoset[10]) 234 a[29].Mul(&a[29], &twiddlesCoset[10]) 235 a[30].Mul(&a[30], &twiddlesCoset[10]) 236 a[31].Mul(&a[31], &twiddlesCoset[10]) 237 a[36].Mul(&a[36], &twiddlesCoset[11]) 238 a[37].Mul(&a[37], &twiddlesCoset[11]) 239 a[38].Mul(&a[38], &twiddlesCoset[11]) 240 a[39].Mul(&a[39], &twiddlesCoset[11]) 241 a[44].Mul(&a[44], &twiddlesCoset[12]) 242 a[45].Mul(&a[45], &twiddlesCoset[12]) 243 a[46].Mul(&a[46], &twiddlesCoset[12]) 244 a[47].Mul(&a[47], &twiddlesCoset[12]) 245 a[52].Mul(&a[52], &twiddlesCoset[13]) 246 a[53].Mul(&a[53], &twiddlesCoset[13]) 247 a[54].Mul(&a[54], &twiddlesCoset[13]) 248 a[55].Mul(&a[55], &twiddlesCoset[13]) 249 a[60].Mul(&a[60], &twiddlesCoset[14]) 250 a[61].Mul(&a[61], &twiddlesCoset[14]) 251 a[62].Mul(&a[62], &twiddlesCoset[14]) 252 a[63].Mul(&a[63], &twiddlesCoset[14]) 253 fr.Butterfly(&a[0], &a[4]) 254 fr.Butterfly(&a[1], &a[5]) 255 fr.Butterfly(&a[2], &a[6]) 256 fr.Butterfly(&a[3], &a[7]) 257 fr.Butterfly(&a[8], &a[12]) 258 fr.Butterfly(&a[9], &a[13]) 259 fr.Butterfly(&a[10], &a[14]) 260 fr.Butterfly(&a[11], &a[15]) 261 fr.Butterfly(&a[16], &a[20]) 262 fr.Butterfly(&a[17], &a[21]) 263 fr.Butterfly(&a[18], &a[22]) 264 fr.Butterfly(&a[19], &a[23]) 265 fr.Butterfly(&a[24], &a[28]) 266 fr.Butterfly(&a[25], &a[29]) 267 fr.Butterfly(&a[26], &a[30]) 268 fr.Butterfly(&a[27], &a[31]) 269 fr.Butterfly(&a[32], &a[36]) 270 fr.Butterfly(&a[33], &a[37]) 271 fr.Butterfly(&a[34], &a[38]) 272 fr.Butterfly(&a[35], &a[39]) 273 fr.Butterfly(&a[40], &a[44]) 274 fr.Butterfly(&a[41], &a[45]) 275 fr.Butterfly(&a[42], &a[46]) 276 fr.Butterfly(&a[43], &a[47]) 277 fr.Butterfly(&a[48], &a[52]) 278 fr.Butterfly(&a[49], &a[53]) 279 fr.Butterfly(&a[50], &a[54]) 280 fr.Butterfly(&a[51], &a[55]) 281 fr.Butterfly(&a[56], &a[60]) 282 fr.Butterfly(&a[57], &a[61]) 283 fr.Butterfly(&a[58], &a[62]) 284 fr.Butterfly(&a[59], &a[63]) 285 a[2].Mul(&a[2], &twiddlesCoset[15]) 286 a[3].Mul(&a[3], &twiddlesCoset[15]) 287 a[6].Mul(&a[6], &twiddlesCoset[16]) 288 a[7].Mul(&a[7], &twiddlesCoset[16]) 289 a[10].Mul(&a[10], &twiddlesCoset[17]) 290 a[11].Mul(&a[11], &twiddlesCoset[17]) 291 a[14].Mul(&a[14], &twiddlesCoset[18]) 292 a[15].Mul(&a[15], &twiddlesCoset[18]) 293 a[18].Mul(&a[18], &twiddlesCoset[19]) 294 a[19].Mul(&a[19], &twiddlesCoset[19]) 295 a[22].Mul(&a[22], &twiddlesCoset[20]) 296 a[23].Mul(&a[23], &twiddlesCoset[20]) 297 a[26].Mul(&a[26], &twiddlesCoset[21]) 298 a[27].Mul(&a[27], &twiddlesCoset[21]) 299 a[30].Mul(&a[30], &twiddlesCoset[22]) 300 a[31].Mul(&a[31], &twiddlesCoset[22]) 301 a[34].Mul(&a[34], &twiddlesCoset[23]) 302 a[35].Mul(&a[35], &twiddlesCoset[23]) 303 a[38].Mul(&a[38], &twiddlesCoset[24]) 304 a[39].Mul(&a[39], &twiddlesCoset[24]) 305 a[42].Mul(&a[42], &twiddlesCoset[25]) 306 a[43].Mul(&a[43], &twiddlesCoset[25]) 307 a[46].Mul(&a[46], &twiddlesCoset[26]) 308 a[47].Mul(&a[47], &twiddlesCoset[26]) 309 a[50].Mul(&a[50], &twiddlesCoset[27]) 310 a[51].Mul(&a[51], &twiddlesCoset[27]) 311 a[54].Mul(&a[54], &twiddlesCoset[28]) 312 a[55].Mul(&a[55], &twiddlesCoset[28]) 313 a[58].Mul(&a[58], &twiddlesCoset[29]) 314 a[59].Mul(&a[59], &twiddlesCoset[29]) 315 a[62].Mul(&a[62], &twiddlesCoset[30]) 316 a[63].Mul(&a[63], &twiddlesCoset[30]) 317 fr.Butterfly(&a[0], &a[2]) 318 fr.Butterfly(&a[1], &a[3]) 319 fr.Butterfly(&a[4], &a[6]) 320 fr.Butterfly(&a[5], &a[7]) 321 fr.Butterfly(&a[8], &a[10]) 322 fr.Butterfly(&a[9], &a[11]) 323 fr.Butterfly(&a[12], &a[14]) 324 fr.Butterfly(&a[13], &a[15]) 325 fr.Butterfly(&a[16], &a[18]) 326 fr.Butterfly(&a[17], &a[19]) 327 fr.Butterfly(&a[20], &a[22]) 328 fr.Butterfly(&a[21], &a[23]) 329 fr.Butterfly(&a[24], &a[26]) 330 fr.Butterfly(&a[25], &a[27]) 331 fr.Butterfly(&a[28], &a[30]) 332 fr.Butterfly(&a[29], &a[31]) 333 fr.Butterfly(&a[32], &a[34]) 334 fr.Butterfly(&a[33], &a[35]) 335 fr.Butterfly(&a[36], &a[38]) 336 fr.Butterfly(&a[37], &a[39]) 337 fr.Butterfly(&a[40], &a[42]) 338 fr.Butterfly(&a[41], &a[43]) 339 fr.Butterfly(&a[44], &a[46]) 340 fr.Butterfly(&a[45], &a[47]) 341 fr.Butterfly(&a[48], &a[50]) 342 fr.Butterfly(&a[49], &a[51]) 343 fr.Butterfly(&a[52], &a[54]) 344 fr.Butterfly(&a[53], &a[55]) 345 fr.Butterfly(&a[56], &a[58]) 346 fr.Butterfly(&a[57], &a[59]) 347 fr.Butterfly(&a[60], &a[62]) 348 fr.Butterfly(&a[61], &a[63]) 349 a[1].Mul(&a[1], &twiddlesCoset[31]) 350 a[3].Mul(&a[3], &twiddlesCoset[32]) 351 a[5].Mul(&a[5], &twiddlesCoset[33]) 352 a[7].Mul(&a[7], &twiddlesCoset[34]) 353 a[9].Mul(&a[9], &twiddlesCoset[35]) 354 a[11].Mul(&a[11], &twiddlesCoset[36]) 355 a[13].Mul(&a[13], &twiddlesCoset[37]) 356 a[15].Mul(&a[15], &twiddlesCoset[38]) 357 a[17].Mul(&a[17], &twiddlesCoset[39]) 358 a[19].Mul(&a[19], &twiddlesCoset[40]) 359 a[21].Mul(&a[21], &twiddlesCoset[41]) 360 a[23].Mul(&a[23], &twiddlesCoset[42]) 361 a[25].Mul(&a[25], &twiddlesCoset[43]) 362 a[27].Mul(&a[27], &twiddlesCoset[44]) 363 a[29].Mul(&a[29], &twiddlesCoset[45]) 364 a[31].Mul(&a[31], &twiddlesCoset[46]) 365 a[33].Mul(&a[33], &twiddlesCoset[47]) 366 a[35].Mul(&a[35], &twiddlesCoset[48]) 367 a[37].Mul(&a[37], &twiddlesCoset[49]) 368 a[39].Mul(&a[39], &twiddlesCoset[50]) 369 a[41].Mul(&a[41], &twiddlesCoset[51]) 370 a[43].Mul(&a[43], &twiddlesCoset[52]) 371 a[45].Mul(&a[45], &twiddlesCoset[53]) 372 a[47].Mul(&a[47], &twiddlesCoset[54]) 373 a[49].Mul(&a[49], &twiddlesCoset[55]) 374 a[51].Mul(&a[51], &twiddlesCoset[56]) 375 a[53].Mul(&a[53], &twiddlesCoset[57]) 376 a[55].Mul(&a[55], &twiddlesCoset[58]) 377 a[57].Mul(&a[57], &twiddlesCoset[59]) 378 a[59].Mul(&a[59], &twiddlesCoset[60]) 379 a[61].Mul(&a[61], &twiddlesCoset[61]) 380 a[63].Mul(&a[63], &twiddlesCoset[62]) 381 fr.Butterfly(&a[0], &a[1]) 382 fr.Butterfly(&a[2], &a[3]) 383 fr.Butterfly(&a[4], &a[5]) 384 fr.Butterfly(&a[6], &a[7]) 385 fr.Butterfly(&a[8], &a[9]) 386 fr.Butterfly(&a[10], &a[11]) 387 fr.Butterfly(&a[12], &a[13]) 388 fr.Butterfly(&a[14], &a[15]) 389 fr.Butterfly(&a[16], &a[17]) 390 fr.Butterfly(&a[18], &a[19]) 391 fr.Butterfly(&a[20], &a[21]) 392 fr.Butterfly(&a[22], &a[23]) 393 fr.Butterfly(&a[24], &a[25]) 394 fr.Butterfly(&a[26], &a[27]) 395 fr.Butterfly(&a[28], &a[29]) 396 fr.Butterfly(&a[30], &a[31]) 397 fr.Butterfly(&a[32], &a[33]) 398 fr.Butterfly(&a[34], &a[35]) 399 fr.Butterfly(&a[36], &a[37]) 400 fr.Butterfly(&a[38], &a[39]) 401 fr.Butterfly(&a[40], &a[41]) 402 fr.Butterfly(&a[42], &a[43]) 403 fr.Butterfly(&a[44], &a[45]) 404 fr.Butterfly(&a[46], &a[47]) 405 fr.Butterfly(&a[48], &a[49]) 406 fr.Butterfly(&a[50], &a[51]) 407 fr.Butterfly(&a[52], &a[53]) 408 fr.Butterfly(&a[54], &a[55]) 409 fr.Butterfly(&a[56], &a[57]) 410 fr.Butterfly(&a[58], &a[59]) 411 fr.Butterfly(&a[60], &a[61]) 412 fr.Butterfly(&a[62], &a[63]) 413 } 414 415 // PrecomputeTwiddlesCoset precomputes twiddlesCoset from twiddles and coset table 416 // it then return all elements in the correct order for the unrolled FFT. 417 func PrecomputeTwiddlesCoset(generator, shifter fr.Element) []fr.Element { 418 toReturn := make([]fr.Element, 63) 419 var r, s fr.Element 420 e := new(big.Int) 421 422 s = shifter 423 for k := 0; k < 5; k++ { 424 s.Square(&s) 425 } 426 toReturn[0] = s 427 s = shifter 428 for k := 0; k < 4; k++ { 429 s.Square(&s) 430 } 431 toReturn[1] = s 432 r.Exp(generator, e.SetUint64(uint64(1<<4*1))) 433 toReturn[2].Mul(&r, &s) 434 s = shifter 435 for k := 0; k < 3; k++ { 436 s.Square(&s) 437 } 438 toReturn[3] = s 439 r.Exp(generator, e.SetUint64(uint64(1<<3*2))) 440 toReturn[4].Mul(&r, &s) 441 r.Exp(generator, e.SetUint64(uint64(1<<3*1))) 442 toReturn[5].Mul(&r, &s) 443 r.Exp(generator, e.SetUint64(uint64(1<<3*3))) 444 toReturn[6].Mul(&r, &s) 445 s = shifter 446 for k := 0; k < 2; k++ { 447 s.Square(&s) 448 } 449 toReturn[7] = s 450 r.Exp(generator, e.SetUint64(uint64(1<<2*4))) 451 toReturn[8].Mul(&r, &s) 452 r.Exp(generator, e.SetUint64(uint64(1<<2*2))) 453 toReturn[9].Mul(&r, &s) 454 r.Exp(generator, e.SetUint64(uint64(1<<2*6))) 455 toReturn[10].Mul(&r, &s) 456 r.Exp(generator, e.SetUint64(uint64(1<<2*1))) 457 toReturn[11].Mul(&r, &s) 458 r.Exp(generator, e.SetUint64(uint64(1<<2*5))) 459 toReturn[12].Mul(&r, &s) 460 r.Exp(generator, e.SetUint64(uint64(1<<2*3))) 461 toReturn[13].Mul(&r, &s) 462 r.Exp(generator, e.SetUint64(uint64(1<<2*7))) 463 toReturn[14].Mul(&r, &s) 464 s = shifter 465 for k := 0; k < 1; k++ { 466 s.Square(&s) 467 } 468 toReturn[15] = s 469 r.Exp(generator, e.SetUint64(uint64(1<<1*8))) 470 toReturn[16].Mul(&r, &s) 471 r.Exp(generator, e.SetUint64(uint64(1<<1*4))) 472 toReturn[17].Mul(&r, &s) 473 r.Exp(generator, e.SetUint64(uint64(1<<1*12))) 474 toReturn[18].Mul(&r, &s) 475 r.Exp(generator, e.SetUint64(uint64(1<<1*2))) 476 toReturn[19].Mul(&r, &s) 477 r.Exp(generator, e.SetUint64(uint64(1<<1*10))) 478 toReturn[20].Mul(&r, &s) 479 r.Exp(generator, e.SetUint64(uint64(1<<1*6))) 480 toReturn[21].Mul(&r, &s) 481 r.Exp(generator, e.SetUint64(uint64(1<<1*14))) 482 toReturn[22].Mul(&r, &s) 483 r.Exp(generator, e.SetUint64(uint64(1<<1*1))) 484 toReturn[23].Mul(&r, &s) 485 r.Exp(generator, e.SetUint64(uint64(1<<1*9))) 486 toReturn[24].Mul(&r, &s) 487 r.Exp(generator, e.SetUint64(uint64(1<<1*5))) 488 toReturn[25].Mul(&r, &s) 489 r.Exp(generator, e.SetUint64(uint64(1<<1*13))) 490 toReturn[26].Mul(&r, &s) 491 r.Exp(generator, e.SetUint64(uint64(1<<1*3))) 492 toReturn[27].Mul(&r, &s) 493 r.Exp(generator, e.SetUint64(uint64(1<<1*11))) 494 toReturn[28].Mul(&r, &s) 495 r.Exp(generator, e.SetUint64(uint64(1<<1*7))) 496 toReturn[29].Mul(&r, &s) 497 r.Exp(generator, e.SetUint64(uint64(1<<1*15))) 498 toReturn[30].Mul(&r, &s) 499 s = shifter 500 for k := 0; k < 0; k++ { 501 s.Square(&s) 502 } 503 toReturn[31] = s 504 r.Exp(generator, e.SetUint64(uint64(1<<0*16))) 505 toReturn[32].Mul(&r, &s) 506 r.Exp(generator, e.SetUint64(uint64(1<<0*8))) 507 toReturn[33].Mul(&r, &s) 508 r.Exp(generator, e.SetUint64(uint64(1<<0*24))) 509 toReturn[34].Mul(&r, &s) 510 r.Exp(generator, e.SetUint64(uint64(1<<0*4))) 511 toReturn[35].Mul(&r, &s) 512 r.Exp(generator, e.SetUint64(uint64(1<<0*20))) 513 toReturn[36].Mul(&r, &s) 514 r.Exp(generator, e.SetUint64(uint64(1<<0*12))) 515 toReturn[37].Mul(&r, &s) 516 r.Exp(generator, e.SetUint64(uint64(1<<0*28))) 517 toReturn[38].Mul(&r, &s) 518 r.Exp(generator, e.SetUint64(uint64(1<<0*2))) 519 toReturn[39].Mul(&r, &s) 520 r.Exp(generator, e.SetUint64(uint64(1<<0*18))) 521 toReturn[40].Mul(&r, &s) 522 r.Exp(generator, e.SetUint64(uint64(1<<0*10))) 523 toReturn[41].Mul(&r, &s) 524 r.Exp(generator, e.SetUint64(uint64(1<<0*26))) 525 toReturn[42].Mul(&r, &s) 526 r.Exp(generator, e.SetUint64(uint64(1<<0*6))) 527 toReturn[43].Mul(&r, &s) 528 r.Exp(generator, e.SetUint64(uint64(1<<0*22))) 529 toReturn[44].Mul(&r, &s) 530 r.Exp(generator, e.SetUint64(uint64(1<<0*14))) 531 toReturn[45].Mul(&r, &s) 532 r.Exp(generator, e.SetUint64(uint64(1<<0*30))) 533 toReturn[46].Mul(&r, &s) 534 r.Exp(generator, e.SetUint64(uint64(1<<0*1))) 535 toReturn[47].Mul(&r, &s) 536 r.Exp(generator, e.SetUint64(uint64(1<<0*17))) 537 toReturn[48].Mul(&r, &s) 538 r.Exp(generator, e.SetUint64(uint64(1<<0*9))) 539 toReturn[49].Mul(&r, &s) 540 r.Exp(generator, e.SetUint64(uint64(1<<0*25))) 541 toReturn[50].Mul(&r, &s) 542 r.Exp(generator, e.SetUint64(uint64(1<<0*5))) 543 toReturn[51].Mul(&r, &s) 544 r.Exp(generator, e.SetUint64(uint64(1<<0*21))) 545 toReturn[52].Mul(&r, &s) 546 r.Exp(generator, e.SetUint64(uint64(1<<0*13))) 547 toReturn[53].Mul(&r, &s) 548 r.Exp(generator, e.SetUint64(uint64(1<<0*29))) 549 toReturn[54].Mul(&r, &s) 550 r.Exp(generator, e.SetUint64(uint64(1<<0*3))) 551 toReturn[55].Mul(&r, &s) 552 r.Exp(generator, e.SetUint64(uint64(1<<0*19))) 553 toReturn[56].Mul(&r, &s) 554 r.Exp(generator, e.SetUint64(uint64(1<<0*11))) 555 toReturn[57].Mul(&r, &s) 556 r.Exp(generator, e.SetUint64(uint64(1<<0*27))) 557 toReturn[58].Mul(&r, &s) 558 r.Exp(generator, e.SetUint64(uint64(1<<0*7))) 559 toReturn[59].Mul(&r, &s) 560 r.Exp(generator, e.SetUint64(uint64(1<<0*23))) 561 toReturn[60].Mul(&r, &s) 562 r.Exp(generator, e.SetUint64(uint64(1<<0*15))) 563 toReturn[61].Mul(&r, &s) 564 r.Exp(generator, e.SetUint64(uint64(1<<0*31))) 565 toReturn[62].Mul(&r, &s) 566 return toReturn 567 }