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  }