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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
//! Addition chains for computing square roots.
//! chain_pm3div4: input x, output x^((p-3)//4).
//! chain_p2m9div16: input x, output x^((p**2 - 9) // 16).
use core::ops::MulAssign;
use crate::{fp::Fp, fp2::Fp2};
macro_rules! square {
($var:expr, $n:expr) => {
for _ in 0..$n {
$var = $var.square();
}
};
}
#[allow(clippy::cognitive_complexity)]
/// addchain for 1000602388805416848354447456433976039139220704984751971333014534031007912622709466110671907282253916009473568139946
/// Bos-Coster (win=4) : 458 links, 16 variables */
/// Addition chain implementing exponentiation by (p - 3) // 4.
pub fn chain_pm3div4(var0: &Fp) -> Fp {
let mut var1 = var0.square();
//Self::sqr(var1, var0); /* 0 : 2 */
let var9 = var1 * var0;
//Self::mul(&mut var9, var1, var0); /* 1 : 3 */
let var5 = var1.square();
//Self::sqr(&mut var5, var1); /* 2 : 4 */
let var2 = var9 * var1;
//Self::mul(&mut var2, &var9, var1); /* 3 : 5 */
let var7 = var5 * var9;
//Self::mul(&mut var7, &var5, &var9); /* 4 : 7 */
let var10 = var2 * var5;
//Self::mul(&mut var10, &var2, &var5); /* 5 : 9 */
let var13 = var7 * var5;
//Self::mul(&mut var13, &var7, &var5); /* 6 : 11 */
let var4 = var10 * var5;
//Self::mul(&mut var4, &var10, &var5); /* 7 : 13 */
let var8 = var13 * var5;
//Self::mul(&mut var8, &var13, &var5); /* 8 : 15 */
let var15 = var4 * var5;
//Self::mul(&mut var15, &var4, &var5); /* 9 : 17 */
let var11 = var8 * var5;
//Self::mul(&mut var11, &var8, &var5); /* 10 : 19 */
let var3 = var15 * var5;
//Self::mul(&mut var3, &var15, &var5); /* 11 : 21 */
let var12 = var11 * var5;
//Self::mul(&mut var12, &var11, &var5); /* 12 : 23 */
var1 = var4.square();
//Self::sqr(var1, &var4); /* 13 : 26 */
let var14 = var12 * var5;
//Self::mul(&mut var14, &var12, &var5); /* 14 : 27 */
let var6 = var1 * var9;
//Self::mul(&mut var6, var1, &var9); /* 15 : 29 */
let var5 = var1 * var2;
//Self::mul(&mut var5, var1, &var2); /* 16 : 31 */
// 17 : 106496
square!(var1, 12);
// 29 : 106513
var1.mul_assign(&var15);
// 30 : 13633664
square!(var1, 7);
// 37 : 13633679
var1.mul_assign(&var8);
// 38 : 218138864
square!(var1, 4);
// 42 : 218138869
var1.mul_assign(&var2);
// 43 : 13960887616
square!(var1, 6);
// 49 : 13960887623
var1.mul_assign(&var7);
// 50 : 1786993615744
square!(var1, 7);
// 57 : 1786993615767
var1.mul_assign(&var12);
// 58 : 57183795704544
square!(var1, 5);
// 63 : 57183795704575
var1.mul_assign(&var5);
// 64 : 228735182818300
square!(var1, 2);
// 66 : 228735182818303
var1.mul_assign(&var9);
// 67 : 14639051700371392
square!(var1, 6);
// 73 : 14639051700371405
var1.mul_assign(&var4);
// 74 : 936899308823769920
square!(var1, 6);
// 80 : 936899308823769933
var1.mul_assign(&var4);
// 81 : 59961555764721275712
square!(var1, 6);
// 87 : 59961555764721275721
var1.mul_assign(&var10);
// 88 : 479692446117770205768
square!(var1, 3);
// 91 : 479692446117770205771
var1.mul_assign(&var9);
// 92 : 61400633103074586338688
square!(var1, 7);
// 99 : 61400633103074586338701
var1.mul_assign(&var4);
// 100 : 982410129649193381419216
square!(var1, 4);
// 104 : 982410129649193381419229
var1.mul_assign(&var4);
// 105 : 62874248297548376410830656
square!(var1, 6);
// 111 : 62874248297548376410830671
var1.mul_assign(&var8);
// 112 : 4023951891043096090293162944
square!(var1, 6);
// 118 : 4023951891043096090293162971
var1.mul_assign(&var14);
// 119 : 32191615128344768722345303768
square!(var1, 3);
// 122 : 32191615128344768722345303769
var1.mul_assign(var0);
// 123 : 8241053472856260792920397764864
square!(var1, 8);
// 131 : 8241053472856260792920397764877
var1.mul_assign(&var4);
// 132 : 1054854844525601381493810913904256
square!(var1, 7);
// 139 : 1054854844525601381493810913904279
var1.mul_assign(&var12);
// 140 : 33755355024819244207801949244936928
square!(var1, 5);
// 145 : 33755355024819244207801949244936939
var1.mul_assign(&var13);
// 146 : 2160342721588431629299324751675964096
square!(var1, 6);
// 152 : 2160342721588431629299324751675964109
var1.mul_assign(&var4);
// 153 : 138261934181659624275156784107261702976
square!(var1, 6);
// 159 : 138261934181659624275156784107261703005
var1.mul_assign(&var6);
// 160 : 2212190946906553988402508545716187248080
square!(var1, 4);
// 164 : 2212190946906553988402508545716187248089
var1.mul_assign(&var10);
// 165 : 566320882408077821031042187703343935510784
square!(var1, 8);
// 173 : 566320882408077821031042187703343935510813
var1.mul_assign(&var6);
// 174 : 9061134118529245136496675003253502968173008
square!(var1, 4);
// 178 : 9061134118529245136496675003253502968173021
var1.mul_assign(&var4);
// 179 : 1159825167171743377471574400416448379926146688
square!(var1, 7);
// 186 : 1159825167171743377471574400416448379926146711
var1.mul_assign(&var12);
// 187 : 593830485591932609265446093013221570522187116032
square!(var1, 9);
// 196 : 593830485591932609265446093013221570522187116051
var1.mul_assign(&var11);
// 197 : 2375321942367730437061784372052886282088748464204
square!(var1, 2);
// 199 : 2375321942367730437061784372052886282088748464207
var1.mul_assign(&var9);
// 200 : 76010302155767373985977099905692361026839950854624
square!(var1, 5);
// 205 : 76010302155767373985977099905692361026839950854631
var1.mul_assign(&var7);
// 206 : 9729318675938223870205068787928622211435513709392768
square!(var1, 7);
// 213 : 9729318675938223870205068787928622211435513709392773
var1.mul_assign(&var2);
// 214 : 1245352790520092655386248804854863643063745754802274944
square!(var1, 7);
// 221 : 1245352790520092655386248804854863643063745754802274953
var1.mul_assign(&var10);
// 222 : 79702578593285929944719923510711273156079728307345596992
square!(var1, 6);
// 228 : 79702578593285929944719923510711273156079728307345597015
var1.mul_assign(&var12);
// 229 : 2550482514985149758231037552342760740994551305835059104480
square!(var1, 5);
// 234 : 2550482514985149758231037552342760740994551305835059104509
var1.mul_assign(&var6);
// 235 : 81615440479524792263393201674968343711825641786721891344288
square!(var1, 5);
// 240 : 81615440479524792263393201674968343711825641786721891344307
var1.mul_assign(&var11);
// 241 : 2611694095344793352428582453598986998778420537175100523017824
square!(var1, 5);
// 246 : 2611694095344793352428582453598986998778420537175100523017843
var1.mul_assign(&var11);
// 247 : 668593688408267098221717108121340671687275657516825733892567808
square!(var1, 8);
// 255 : 668593688408267098221717108121340671687275657516825733892567821
var1.mul_assign(&var4);
// 256 : 85579992116258188572379789839531605975971284162153693938248681088
square!(var1, 7);
// 263 : 85579992116258188572379789839531605975971284162153693938248681109
var1.mul_assign(&var3);
// 264 : 43816955963524192549058452397840182259697297491022691296383324727808
square!(var1, 9);
// 273 : 43816955963524192549058452397840182259697297491022691296383324727823
var1.mul_assign(&var8);
// 274 : 1402142590832774161569870476730885832310313519712726121484266391290336
square!(var1, 5);
// 279 : 1402142590832774161569870476730885832310313519712726121484266391290349
var1.mul_assign(&var4);
// 280 : 11217140726662193292558963813847086658482508157701808971874131130322792
square!(var1, 3);
// 283 : 11217140726662193292558963813847086658482508157701808971874131130322795
var1.mul_assign(&var9);
// 284 : 2871588026025521482895094736344854184571522088371663096799777569362635520
square!(var1, 8);
// 292 : 2871588026025521482895094736344854184571522088371663096799777569362635535
var1.mul_assign(&var8);
// 293 : 22972704208204171863160757890758833476572176706973304774398220554901084280
square!(var1, 3);
// 296 : 22972704208204171863160757890758833476572176706973304774398220554901084283
var1.mul_assign(&var9);
// 297 : 2940506138650133998484577010017130685001238618492583011122972231027338788224
square!(var1, 7);
// 304 : 2940506138650133998484577010017130685001238618492583011122972231027338788233
var1.mul_assign(&var10);
// 305 : 1505539142988868607224103429128770910720634172668202501694961782285997459575296
square!(var1, 9);
// 314 : 1505539142988868607224103429128770910720634172668202501694961782285997459575311
var1.mul_assign(&var8);
// 315 : 96354505151287590862342619464241338286120587050764960108477554066303837412819904
square!(var1, 6);
// 321 : 96354505151287590862342619464241338286120587050764960108477554066303837412819925
var1.mul_assign(&var3);
// 322 : 6166688329682405815189927645711445650311717571248957446942563460243445594420475200
square!(var1, 6);
// 328 : 6166688329682405815189927645711445650311717571248957446942563460243445594420475231
var1.mul_assign(&var5);
// 329 : 197334026549836986086077684662766260809974962279966638302162030727790259021455207392
square!(var1, 5);
// 334 : 197334026549836986086077684662766260809974962279966638302162030727790259021455207423
var1.mul_assign(&var5);
// 335 : 6314688849594783554754485909208520345919198792958932425669184983289288288686566637536
square!(var1, 5);
// 340 : 6314688849594783554754485909208520345919198792958932425669184983289288288686566637567
var1.mul_assign(&var5);
// 341 : 101035021593516536876071774547336325534707180687342918810706959732628612618985066201072
square!(var1, 4);
// 345 : 101035021593516536876071774547336325534707180687342918810706959732628612618985066201085
var1.mul_assign(&var4);
// 346 : 808280172748132295008574196378690604277657445498743350485655677861028900951880529608680
square!(var1, 3);
// 349 : 808280172748132295008574196378690604277657445498743350485655677861028900951880529608683
var1.mul_assign(&var9);
// 350 : 206919724223521867522194994272944794695080306047678297724327853532423398643681415579822848
square!(var1, 8);
// 358 : 206919724223521867522194994272944794695080306047678297724327853532423398643681415579822869
var1.mul_assign(&var3);
// 359 : 26485724700610799042840959266936933720970279174102822108713965252150195026391221194217327232
square!(var1, 7);
// 366 : 26485724700610799042840959266936933720970279174102822108713965252150195026391221194217327263
var1.mul_assign(&var5);
// 367 : 847543190419545569370910696541981879071048933571290307478846888068806240844519078214954472416
square!(var1, 5);
// 372 : 847543190419545569370910696541981879071048933571290307478846888068806240844519078214954472447
var1.mul_assign(&var5);
// 373 : 27121382093425458219869142289343420130273565874281289839323100418201799707024610502878543118304
square!(var1, 5);
// 378 : 27121382093425458219869142289343420130273565874281289839323100418201799707024610502878543118335
var1.mul_assign(&var5);
// 379 : 433942113494807331517906276629494722084377053988500637429169606691228795312393768046056689893360
square!(var1, 4);
// 383 : 433942113494807331517906276629494722084377053988500637429169606691228795312393768046056689893375
var1.mul_assign(&var8);
// 384 : 6943073815916917304286500426071915553350032863816010198866713707059660724998300288736907038294000
square!(var1, 4);
// 388 : 6943073815916917304286500426071915553350032863816010198866713707059660724998300288736907038294007
var1.mul_assign(&var7);
// 389 : 888713448437365414948672054537205190828804206568449305454939354503636572799782436958324100901632896
square!(var1, 7);
// 396 : 888713448437365414948672054537205190828804206568449305454939354503636572799782436958324100901632927
var1.mul_assign(&var5);
// 397 : 28438830349995693278357505745190566106521734610190377774558059344116370329593037982666371228852253664
square!(var1, 5);
// 402 : 28438830349995693278357505745190566106521734610190377774558059344116370329593037982666371228852253693
var1.mul_assign(&var6);
// 403 : 910042571199862184907440183846098115408695507526092088785857899011723850546977215445323879323272118176
square!(var1, 5);
// 408 : 910042571199862184907440183846098115408695507526092088785857899011723850546977215445323879323272118207
var1.mul_assign(&var5);
// 409 : 29121362278395589917038085883075139693078256240834946841147452768375163217503270894250364138344707782624
square!(var1, 5);
// 414 : 29121362278395589917038085883075139693078256240834946841147452768375163217503270894250364138344707782655
var1.mul_assign(&var5);
// 415 : 931883592908658877345218748258404470178504199706718298916718488588005222960104668616011652427030649044960
square!(var1, 5);
// 420 : 931883592908658877345218748258404470178504199706718298916718488588005222960104668616011652427030649044991
var1.mul_assign(&var5);
// 421 : 29820274973077084075046999944268943045712134390614985565334991634816167134723349395712372877664980769439712
square!(var1, 5);
// 426 : 29820274973077084075046999944268943045712134390614985565334991634816167134723349395712372877664980769439743
var1.mul_assign(&var5);
// 427 : 954248799138466690401503998216606177462788300499679538090719732314117348311147180662795932085279384622071776
square!(var1, 5);
// 432 : 954248799138466690401503998216606177462788300499679538090719732314117348311147180662795932085279384622071807
var1.mul_assign(&var5);
// 433 : 30535961572430934092848127942931397678809225615989745218903031434051755145956709781209469826728940307906297824
square!(var1, 5);
// 438 : 30535961572430934092848127942931397678809225615989745218903031434051755145956709781209469826728940307906297855
var1.mul_assign(&var5);
// 439 : 488575385158894945485570047086902362860947609855835923502448502944828082335307356499351517227663044926500765680
square!(var1, 4);
// 443 : 488575385158894945485570047086902362860947609855835923502448502944828082335307356499351517227663044926500765693
var1.mul_assign(&var4);
// 444 : 31268824650169276511076483013561751223100647030773499104156704188468997269459670815958497102570434875296049004352
square!(var1, 6);
// 450 : 31268824650169276511076483013561751223100647030773499104156704188468997269459670815958497102570434875296049004373
var1.mul_assign(&var3);
// 451 : 500301194402708424177223728216988019569610352492375985666507267015503956311354733055335953641126958004736784069968
square!(var1, 4);
// 455 : 500301194402708424177223728216988019569610352492375985666507267015503956311354733055335953641126958004736784069973
var1.mul_assign(&var2);
// 456 : 1000602388805416848354447456433976039139220704984751971333014534031007912622709466110671907282253916009473568139946
var1.square()
}
#[allow(clippy::cognitive_complexity)]
/// addchain for 1001205140483106588246484290269935788605945006208159541241399033561623546780709821462541004956387089373434649096260670658193992783731681621012512651314777238193313314641988297376025498093520728838658813979860931248214124593092835
/// Bos-Coster (win=4) : 895 links, 17 variables
/// Addition chain implementing exponentiation by (p**2 - 9) // 16.
pub fn chain_p2m9div16(var0: &Fp2) -> Fp2 {
let mut var1 = var0.square();
//Self::sqr(var1, var0); /* 0 : 2 */
let var2 = var1 * var0;
//Self::mul(&mut var2, var1, var0); /* 1 : 3 */
let var15 = var2 * var1;
//Self::mul(&mut var15, &var2, var1); /* 2 : 5 */
let var3 = var15 * var1;
//Self::mul(&mut var3, &var15, var1); /* 3 : 7 */
let var14 = var3 * var1;
//Self::mul(&mut var14, &var3, var1); /* 4 : 9 */
let var13 = var14 * var1;
//Self::mul(&mut var13, &var14, var1); /* 5 : 11 */
let var5 = var13 * var1;
//Self::mul(&mut var5, &var13, var1); /* 6 : 13 */
let var10 = var5 * var1;
//Self::mul(&mut var10, &var5, var1); /* 7 : 15 */
let var9 = var10 * var1;
//Self::mul(&mut var9, &var10, var1); /* 8 : 17 */
let var16 = var9 * var1;
//Self::mul(&mut var16, &var9, var1); /* 9 : 19 */
let var4 = var16 * var1;
//Self::mul(&mut var4, &var16, var1); /* 10 : 21 */
let var7 = var4 * var1;
//Self::mul(&mut var7, &var4, var1); /* 11 : 23 */
let var6 = var7 * var1;
//Self::mul(&mut var6, &var7, var1); /* 12 : 25 */
let var12 = var6 * var1;
//Self::mul(&mut var12, &var6, var1); /* 13 : 27 */
let var8 = var12 * var1;
//Self::mul(&mut var8, &var12, var1); /* 14 : 29 */
let var11 = var8 * var1;
//Self::mul(&mut var11, &var8, var1); /* 15 : 31 */
var1 = var4.square();
//Self::sqr(var1, &var4); /* 16 : 42 */
// 17 : 168
square!(var1, 2);
// 19 : 169
var1.mul_assign(var0);
// 20 : 86528
square!(var1, 9);
// 29 : 86555
var1.mul_assign(&var12);
// 30 : 1384880
square!(var1, 4);
// 34 : 1384893
var1.mul_assign(&var5);
// 35 : 88633152
square!(var1, 6);
// 41 : 88633161
var1.mul_assign(&var14);
// 42 : 1418130576
square!(var1, 4);
// 46 : 1418130583
var1.mul_assign(&var3);
// 47 : 45380178656
square!(var1, 5);
// 52 : 45380178659
var1.mul_assign(&var2);
// 53 : 11617325736704
square!(var1, 8);
// 61 : 11617325736717
var1.mul_assign(&var5);
// 62 : 185877211787472
square!(var1, 4);
// 66 : 185877211787479
var1.mul_assign(&var3);
// 67 : 2974035388599664
square!(var1, 4);
// 71 : 2974035388599679
var1.mul_assign(&var10);
// 72 : 761353059481517824
square!(var1, 8);
// 80 : 761353059481517853
var1.mul_assign(&var8);
// 81 : 48726595806817142592
square!(var1, 6);
// 87 : 48726595806817142603
var1.mul_assign(&var13);
// 88 : 779625532909074281648
square!(var1, 4);
// 92 : 779625532909074281661
var1.mul_assign(&var5);
// 93 : 6237004263272594253288
square!(var1, 3);
// 96 : 6237004263272594253289
var1.mul_assign(var0);
// 97 : 399168272849446032210496
square!(var1, 6);
// 103 : 399168272849446032210511
var1.mul_assign(&var10);
// 104 : 102187077849458184245890816
square!(var1, 8);
// 112 : 102187077849458184245890845
var1.mul_assign(&var8);
// 113 : 6539972982365323791737014080
square!(var1, 6);
// 119 : 6539972982365323791737014101
var1.mul_assign(&var4);
// 120 : 1674233083485522890684675609856
square!(var1, 8);
// 128 : 1674233083485522890684675609873
var1.mul_assign(&var9);
// 129 : 53575458671536732501909619515936
square!(var1, 5);
// 134 : 53575458671536732501909619515951
var1.mul_assign(&var10);
// 135 : 3428829354978350880122215649020864
square!(var1, 6);
// 141 : 3428829354978350880122215649020873
var1.mul_assign(&var14);
// 142 : 109722539359307228163910900768667936
square!(var1, 5);
// 147 : 109722539359307228163910900768667951
var1.mul_assign(&var10);
// 148 : 438890157437228912655643603074671804
square!(var1, 2);
// 150 : 438890157437228912655643603074671805
var1.mul_assign(var0);
// 151 : 28088970075982650409961190596778995520
square!(var1, 6);
// 157 : 28088970075982650409961190596778995535
var1.mul_assign(&var10);
// 158 : 3595388169725779252475032396387711428480
square!(var1, 7);
// 165 : 3595388169725779252475032396387711428491
var1.mul_assign(&var13);
// 166 : 57526210715612468039600518342203382855856
square!(var1, 4);
// 170 : 57526210715612468039600518342203382855863
var1.mul_assign(&var3);
// 171 : 3681677485799197954534433173901016502775232
square!(var1, 6);
// 177 : 3681677485799197954534433173901016502775241
var1.mul_assign(&var14);
// 178 : 471254718182297338180407446259330112355230848
square!(var1, 7);
// 185 : 471254718182297338180407446259330112355230855
var1.mul_assign(&var3);
// 186 : 15080150981833514821773038280298563595367387360
square!(var1, 5);
// 191 : 15080150981833514821773038280298563595367387365
var1.mul_assign(&var15);
// 192 : 1930259325674689897186948899878216140207025582720
square!(var1, 7);
// 199 : 1930259325674689897186948899878216140207025582727
var1.mul_assign(&var3);
// 200 : 61768298421590076709982364796102916486624818647264
square!(var1, 5);
// 205 : 61768298421590076709982364796102916486624818647271
var1.mul_assign(&var3);
// 206 : 63250737583708238551021941551209386482303814294805504
square!(var1, 10);
// 216 : 63250737583708238551021941551209386482303814294805521
var1.mul_assign(&var9);
// 217 : 506005900669665908408175532409675091858430514358444168
square!(var1, 3);
// 220 : 506005900669665908408175532409675091858430514358444173
var1.mul_assign(&var15);
// 221 : 16192188821429309069061617037109602939469776459470213536
square!(var1, 5);
// 226 : 16192188821429309069061617037109602939469776459470213549
var1.mul_assign(&var5);
// 227 : 4145200338285903121679773961500058352504262773624374668544
square!(var1, 8);
// 235 : 4145200338285903121679773961500058352504262773624374668569
var1.mul_assign(&var6);
// 236 : 132646410825148899893752766768001867280136408755979989394208
square!(var1, 5);
// 241 : 132646410825148899893752766768001867280136408755979989394231
var1.mul_assign(&var7);
// 242 : 8489370292809529593200177073152119505928730160382719321230784
square!(var1, 6);
// 248 : 8489370292809529593200177073152119505928730160382719321230795
var1.mul_assign(&var13);
// 249 : 543319698739809893964811332681735648379438730264494036558770880
square!(var1, 6);
// 255 : 543319698739809893964811332681735648379438730264494036558770895
var1.mul_assign(&var10);
// 256 : 34772460719347833213747925291631081496284078736927618339761337280
square!(var1, 6);
// 262 : 34772460719347833213747925291631081496284078736927618339761337289
var1.mul_assign(&var14);
// 263 : 4450874972076522651359734437328778431524362078326735147489451172992
square!(var1, 7);
// 270 : 4450874972076522651359734437328778431524362078326735147489451173011
var1.mul_assign(&var16);
// 271 : 142427999106448724843511501994520909808779586506455524719662437536352
square!(var1, 5);
// 276 : 142427999106448724843511501994520909808779586506455524719662437536361
var1.mul_assign(&var14);
// 277 : 9115391942812718389984736127649338227761893536413153582058396002327104
square!(var1, 6);
// 283 : 9115391942812718389984736127649338227761893536413153582058396002327119
var1.mul_assign(&var10);
// 284 : 583385084340013976959023112169557646576761186330441829251737344148935616
square!(var1, 6);
// 290 : 583385084340013976959023112169557646576761186330441829251737344148935633
var1.mul_assign(&var9);
// 291 : 18668322698880447262688739589425844690456357962574138536055595012765940256
square!(var1, 5);
// 296 : 18668322698880447262688739589425844690456357962574138536055595012765940271
var1.mul_assign(&var10);
// 297 : 74673290795521789050754958357703378761825431850296554144222380051063761084
square!(var1, 2);
// 299 : 74673290795521789050754958357703378761825431850296554144222380051063761085
var1.mul_assign(var0);
// 300 : 19116362443653577996993269339572064963027310553675917860920929293072322837760
square!(var1, 8);
// 308 : 19116362443653577996993269339572064963027310553675917860920929293072322837765
var1.mul_assign(&var15);
// 309 : 2446894392787657983615138475465224315267495750870517486197878949513257323233920
square!(var1, 7);
// 316 : 2446894392787657983615138475465224315267495750870517486197878949513257323233925
var1.mul_assign(&var15);
// 317 : 39150310284602527737842215607443589044279932013928279779166063192212117171742800
square!(var1, 4);
// 321 : 39150310284602527737842215607443589044279932013928279779166063192212117171742803
var1.mul_assign(&var2);
// 322 : 5011239716429123550443803597752779397667831297782819811733256088603150997983078784
square!(var1, 7);
// 329 : 5011239716429123550443803597752779397667831297782819811733256088603150997983078795
var1.mul_assign(&var13);
// 330 : 320719341851463907228403430256177881450741203058100467950928389670601663870917042880
square!(var1, 6);
// 336 : 320719341851463907228403430256177881450741203058100467950928389670601663870917042895
var1.mul_assign(&var10);
// 337 : 5131509469623422515654454884098846103211859248929607487214854234729626621934672686320
square!(var1, 4);
// 341 : 5131509469623422515654454884098846103211859248929607487214854234729626621934672686333
var1.mul_assign(&var5);
// 342 : 656833212111798082003770225164652301211117983862989758363501342045392207607638103850624
square!(var1, 7);
// 349 : 656833212111798082003770225164652301211117983862989758363501342045392207607638103850635
var1.mul_assign(&var13);
// 350 : 42037325575155077248241294410537747277511550967231344535264085890905101286888838646440640
square!(var1, 6);
// 356 : 42037325575155077248241294410537747277511550967231344535264085890905101286888838646440667
var1.mul_assign(&var12);
// 357 : 1345194418404962471943721421137207912880369630951403025128450748508963241180442836686101344
square!(var1, 5);
// 362 : 1345194418404962471943721421137207912880369630951403025128450748508963241180442836686101367
var1.mul_assign(&var7);
// 363 : 43046221388958799102199085476390653212171828190444896804110423952286823717774170773955243744
square!(var1, 5);
// 368 : 43046221388958799102199085476390653212171828190444896804110423952286823717774170773955243749
var1.mul_assign(&var15);
// 369 : 5509916337786726285081482940978003611157994008376946790926134265892713435875093859066271199872
square!(var1, 7);
// 376 : 5509916337786726285081482940978003611157994008376946790926134265892713435875093859066271199899
var1.mul_assign(&var12);
// 377 : 176317322809175241122607454111296115557055808268062297309636296508566829948003003490120678396768
square!(var1, 5);
// 382 : 176317322809175241122607454111296115557055808268062297309636296508566829948003003490120678396791
var1.mul_assign(&var7);
// 383 : 5642154329893607715923438531561475697825785864577993513908361488274138558336096111683861708697312
square!(var1, 5);
// 388 : 5642154329893607715923438531561475697825785864577993513908361488274138558336096111683861708697333
var1.mul_assign(&var4);
// 389 : 90274469278297723454775016504983611165212573833247896222533783812386216933377537786941787339157328
square!(var1, 4);
// 393 : 90274469278297723454775016504983611165212573833247896222533783812386216933377537786941787339157331
var1.mul_assign(&var2);
// 394 : 5777566033811054301105601056318951114573604725327865358242162163992717883736162418364274389706069184
square!(var1, 6);
// 400 : 5777566033811054301105601056318951114573604725327865358242162163992717883736162418364274389706069189
var1.mul_assign(&var15);
// 401 : 369764226163907475270758467604412871332710702420983382927498378495533944559114394775313560941188428096
square!(var1, 6);
// 407 : 369764226163907475270758467604412871332710702420983382927498378495533944559114394775313560941188428105
var1.mul_assign(&var14);
// 408 : 5916227618622519604332135481670605941323371238735734126839974055928543112945830316405016975059014849680
square!(var1, 4);
// 412 : 5916227618622519604332135481670605941323371238735734126839974055928543112945830316405016975059014849683
var1.mul_assign(&var2);
// 413 : 94659641897960313669314167706729695061173939819771746029439584894856689807133285062480271600944237594928
square!(var1, 4);
// 417 : 94659641897960313669314167706729695061173939819771746029439584894856689807133285062480271600944237594931
var1.mul_assign(&var2);
// 418 : 24232868325877840299344426932922801935660528593861566983536533733083312590626120975994949529841724824302336
square!(var1, 8);
// 426 : 24232868325877840299344426932922801935660528593861566983536533733083312590626120975994949529841724824302345
var1.mul_assign(&var14);
// 427 : 775451786428090889579021661853529661941136915003570143473169079458666002900035871231838384954935194377675040
square!(var1, 5);
// 432 : 775451786428090889579021661853529661941136915003570143473169079458666002900035871231838384954935194377675055
var1.mul_assign(&var10);
// 433 : 49628914331397816933057386358625898364232762560228489182282821085354624185602295758837656637115852440171203520
square!(var1, 6);
// 439 : 49628914331397816933057386358625898364232762560228489182282821085354624185602295758837656637115852440171203527
var1.mul_assign(&var3);
// 440 : 1588125258604730141857836363476028747655448401927311653833050274731347973939273464282805012387707278085478512864
square!(var1, 5);
// 445 : 1588125258604730141857836363476028747655448401927311653833050274731347973939273464282805012387707278085478512879
var1.mul_assign(&var10);
// 446 : 6504961059244974661049697744797813750396716654294268534100173925299601301255264109702369330740049011038119988752384
square!(var1, 12);
// 458 : 6504961059244974661049697744797813750396716654294268534100173925299601301255264109702369330740049011038119988752401
var1.mul_assign(&var9);
// 459 : 104079376947919594576795163916765020006347466468708296545602782804793620820084225755237909291840784176609919820038416
square!(var1, 4);
// 463 : 104079376947919594576795163916765020006347466468708296545602782804793620820084225755237909291840784176609919820038429
var1.mul_assign(&var5);
// 464 : 3330540062333427026457445245336480640203118926998665489459289049753395866242695224167613097338905093651517434241229728
square!(var1, 5);
// 469 : 3330540062333427026457445245336480640203118926998665489459289049753395866242695224167613097338905093651517434241229741
var1.mul_assign(&var5);
// 470 : 213154563989339329693276495701534760972999611327914591325394499184217335439532494346727238229689925993697115791438703424
square!(var1, 6);
// 476 : 213154563989339329693276495701534760972999611327914591325394499184217335439532494346727238229689925993697115791438703427
var1.mul_assign(&var2);
// 477 : 109135136762541736802957565799185797618175800999892270758601983582319275745040637105524345973601242108772923285216616154624
square!(var1, 9);
// 486 : 109135136762541736802957565799185797618175800999892270758601983582319275745040637105524345973601242108772923285216616154649
var1.mul_assign(&var6);
// 487 : 3492324376401335577694642105573945523781625631996552664275263474634216823841300387376779071155239747480733545126931716948768
square!(var1, 5);
// 492 : 3492324376401335577694642105573945523781625631996552664275263474634216823841300387376779071155239747480733545126931716948793
var1.mul_assign(&var6);
// 493 : 223508760089685476972457094756732513522024040447779370513616862376589876725843224792113860553935343838766946888123629884722752
square!(var1, 6);
// 499 : 223508760089685476972457094756732513522024040447779370513616862376589876725843224792113860553935343838766946888123629884722755
var1.mul_assign(&var2);
// 500 : 14304560645739870526237254064430880865409538588657879712871479192101752110453966386695287075451862005681084600839912312622256320
square!(var1, 6);
// 506 : 14304560645739870526237254064430880865409538588657879712871479192101752110453966386695287075451862005681084600839912312622256323
var1.mul_assign(&var2);
// 507 : 7323935050618813709433474080988611003089683757392834412990197346356097080552430789987986982631353346908715315630035104062595237376
square!(var1, 9);
// 516 : 7323935050618813709433474080988611003089683757392834412990197346356097080552430789987986982631353346908715315630035104062595237399
var1.mul_assign(&var7);
// 517 : 937463686479208154807484682366542208395479520946282804862745260333580426310711141118462333776813228404315560400644493320012190387072
square!(var1, 7);
// 524 : 937463686479208154807484682366542208395479520946282804862745260333580426310711141118462333776813228404315560400644493320012190387087
var1.mul_assign(&var10);
// 525 : 59997675934669321907679019671458701337310689340562099511215696661349147283885513031581589361716046617876195865641247572480780184773568
square!(var1, 6);
// 531 : 59997675934669321907679019671458701337310689340562099511215696661349147283885513031581589361716046617876195865641247572480780184773593
var1.mul_assign(&var6);
// 532 : 1919925629909418301045728629486678442793942058897987184358902293163172713084336417010610859574913491772038267700519922319384965912754976
square!(var1, 5);
// 537 : 1919925629909418301045728629486678442793942058897987184358902293163172713084336417010610859574913491772038267700519922319384965912754985
var1.mul_assign(&var14);
// 538 : 245750480628405542533853264574294840677624583538942359597939493524886107274795061377358190025588926946820898265666550056881275636832638080
square!(var1, 7);
// 545 : 245750480628405542533853264574294840677624583538942359597939493524886107274795061377358190025588926946820898265666550056881275636832638103
var1.mul_assign(&var7);
// 546 : 983001922513622170135413058297179362710498334155769438391757974099544429099180245509432760102355707787283593062666200227525102547330552412
square!(var1, 2);
// 548 : 983001922513622170135413058297179362710498334155769438391757974099544429099180245509432760102355707787283593062666200227525102547330552413
var1.mul_assign(var0);
// 549 : 251648492163487275554665742924077916853887573543876976228290041369483373849390142850414786586203061193544599824042547258246426252116621417728
square!(var1, 8);
// 557 : 251648492163487275554665742924077916853887573543876976228290041369483373849390142850414786586203061193544599824042547258246426252116621417739
var1.mul_assign(&var13);
// 558 : 4026375874615796408874651886785246669662201176702031619652640661911733981590242285606636585379248979096713597184680756131942820033865942683824
square!(var1, 4);
// 562 : 4026375874615796408874651886785246669662201176702031619652640661911733981590242285606636585379248979096713597184680756131942820033865942683829
var1.mul_assign(&var15);
// 563 : 515376111950821940335955441508511573716761750617860047315538004724701949643551012557649482928543869324379340439639136784888680964334840663530112
square!(var1, 7);
// 570 : 515376111950821940335955441508511573716761750617860047315538004724701949643551012557649482928543869324379340439639136784888680964334840663530119
var1.mul_assign(&var3);
// 571 : 131936284659410416726004593026178962871491008158172172112777729209523699108749059214758267629707230547041111152547619016931502326869719209863710464
square!(var1, 8);
// 579 : 131936284659410416726004593026178962871491008158172172112777729209523699108749059214758267629707230547041111152547619016931502326869719209863710473
var1.mul_assign(&var14);
// 580 : 16887844436404533340928587907350907247550849044246038030435549338819033485919879579489058256602525510021262227526095234167232297839324058862554940544
square!(var1, 7);
// 587 : 16887844436404533340928587907350907247550849044246038030435549338819033485919879579489058256602525510021262227526095234167232297839324058862554940557
var1.mul_assign(&var5);
// 588 : 17293152702878242141110874017127329021492069421307942943166002522950690289581956689396795654760986122261772520986721519787245872987467836275256259130368
square!(var1, 10);
// 598 : 17293152702878242141110874017127329021492069421307942943166002522950690289581956689396795654760986122261772520986721519787245872987467836275256259130377
var1.mul_assign(&var14);
// 599 : 1106761772984207497031095937096149057375492442963708348362624161468844178533245228121394921904703111824753441343150177266383735871197941521616400584344128
square!(var1, 6);
// 605 : 1106761772984207497031095937096149057375492442963708348362624161468844178533245228121394921904703111824753441343150177266383735871197941521616400584344139
var1.mul_assign(&var13);
// 606 : 70832753470989279809990139974153539672031516349677334295207946334006027426127694599769275001900999156784220245961611345048559095756668257383449637398024896
square!(var1, 6);
// 612 : 70832753470989279809990139974153539672031516349677334295207946334006027426127694599769275001900999156784220245961611345048559095756668257383449637398024909
var1.mul_assign(&var5);
// 613 : 4533296222143313907839368958345826539010017046379349394893308565376385755272172454385233600121663946034190095741543126083107782128426768472540776793473594176
square!(var1, 6);
// 619 : 4533296222143313907839368958345826539010017046379349394893308565376385755272172454385233600121663946034190095741543126083107782128426768472540776793473594207
var1.mul_assign(&var11);
// 620 : 145065479108586045050859806667066449248320545484139180636585874092044344168709518540327475203893246273094083063729380034659449028109656591121304857391155014624
square!(var1, 5);
// 625 : 145065479108586045050859806667066449248320545484139180636585874092044344168709518540327475203893246273094083063729380034659449028109656591121304857391155014649
var1.mul_assign(&var6);
// 626 : 18568381325899013766510055253384505503785029821969815121482991883781676053594818373161916826098335522956042632157360644436409475598036043663527021746067841875072
square!(var1, 7);
// 633 : 18568381325899013766510055253384505503785029821969815121482991883781676053594818373161916826098335522956042632157360644436409475598036043663527021746067841875087
var1.mul_assign(&var10);
// 634 : 594188202428768440528321768108304176121120954303034083887455740281013633715034187941181338435146736734593364229035540621965103219137153397232864695874170940002784
square!(var1, 5);
// 639 : 594188202428768440528321768108304176121120954303034083887455740281013633715034187941181338435146736734593364229035540621965103219137153397232864695874170940002797
var1.mul_assign(&var5);
// 640 : 76056089910882360387625186317862934543503482150788362737594334755969745115524376056471211319698782302027950621316549199611533212049555634845806681071893880320358016
square!(var1, 7);
// 647 : 76056089910882360387625186317862934543503482150788362737594334755969745115524376056471211319698782302027950621316549199611533212049555634845806681071893880320358047
var1.mul_assign(&var11);
// 648 : 2433794877148235532404005962171613905392111428825227607603018712191031843696780033807078762230361033664894419882129574387569062785585780315065813794300604170251457504
square!(var1, 5);
// 653 : 2433794877148235532404005962171613905392111428825227607603018712191031843696780033807078762230361033664894419882129574387569062785585780315065813794300604170251457511
var1.mul_assign(&var3);
// 654 : 623051488549948296295425526315933159780380525779258267546372790320904151986375688654612163130972424618212971489825171043217680073109959760656848331340954667584373122816
square!(var1, 8);
// 662 : 623051488549948296295425526315933159780380525779258267546372790320904151986375688654612163130972424618212971489825171043217680073109959760656848331340954667584373122843
var1.mul_assign(&var12);
// 663 : 39875295267196690962907233684219722225944353649872529122967858580537865727128044073895178440382235175565630175348810946765931524679037424682038293205821098725399879861952
square!(var1, 6);
// 669 : 39875295267196690962907233684219722225944353649872529122967858580537865727128044073895178440382235175565630175348810946765931524679037424682038293205821098725399879861981
var1.mul_assign(&var8);
// 670 : 2552018897100588221626062955790062222460438633591841863869942949154423406536194820729291420184463051236200331222323900593019617579458395179650450765172550318425592311166784
square!(var1, 6);
// 676 : 2552018897100588221626062955790062222460438633591841863869942949154423406536194820729291420184463051236200331222323900593019617579458395179650450765172550318425592311166787
var1.mul_assign(&var2);
// 677 : 326658418828875292368136058341127964474936145099755758575352697491766196036632937053349301783611270558233642396457459275906511050170674582995257697942086440758475815829348736
square!(var1, 7);
// 684 : 326658418828875292368136058341127964474936145099755758575352697491766196036632937053349301783611270558233642396457459275906511050170674582995257697942086440758475815829348747
var1.mul_assign(&var13);
// 685 : 41812277610096037423121415467664379452791826572768737097645145278946073092689015942828710628302242631453906226746554787316033414421846346623392985336587064417084904426156639616
square!(var1, 7);
// 692 : 41812277610096037423121415467664379452791826572768737097645145278946073092689015942828710628302242631453906226746554787316033414421846346623392985336587064417084904426156639627
var1.mul_assign(&var13);
// 693 : 2675985767046146395079770589930520284978676900657199174249289297852548677932097020341037480211343528413049998511779506388226138522998166183897151061541572122693433883274024936128
square!(var1, 6);
// 699 : 2675985767046146395079770589930520284978676900657199174249289297852548677932097020341037480211343528413049998511779506388226138522998166183897151061541572122693433883274024936131
var1.mul_assign(&var2);
// 700 : 85631544545476684642552658877776649119317660821030373575977257531281557693827104650913199366762992909217599952376944204423236432735941317884708833969330307926189884264768797956192
square!(var1, 5);
// 705 : 85631544545476684642552658877776649119317660821030373575977257531281557693827104650913199366762992909217599952376944204423236432735941317884708833969330307926189884264768797956199
var1.mul_assign(&var3);
// 706 : 87686701614568125073973922690843288698181284680735102541800711712032315078478955162535116151565304739038822351233990865329394107121603909513941845984594235316418441487123249107147776
square!(var1, 10);
// 716 : 87686701614568125073973922690843288698181284680735102541800711712032315078478955162535116151565304739038822351233990865329394107121603909513941845984594235316418441487123249107147803
var1.mul_assign(&var12);
// 717 : 1402987225833090001183582763053492619170900554891761640668811387392517041255663282600561858425044875824621157619743853845270305713945662552223069535753507765062695063793971985714364848
square!(var1, 4);
// 721 : 1402987225833090001183582763053492619170900554891761640668811387392517041255663282600561858425044875824621157619743853845270305713945662552223069535753507765062695063793971985714364849
var1.mul_assign(var0);
// 722 : 718329459626542080605994374683388221015501084104581960022431430344968725122899600691487671513622976422206032701308853168778396525540179226738211602305795975712099872662513656685754802688
square!(var1, 9);
// 731 : 718329459626542080605994374683388221015501084104581960022431430344968725122899600691487671513622976422206032701308853168778396525540179226738211602305795975712099872662513656685754802705
var1.mul_assign(&var9);
// 732 : 45973085416098693158783639979736846144992069382693245441435611542077998407865574444255210976871870491021186092883766602801817377634571470511245542547570942445574391850400874027888307373120
square!(var1, 6);
// 738 : 45973085416098693158783639979736846144992069382693245441435611542077998407865574444255210976871870491021186092883766602801817377634571470511245542547570942445574391850400874027888307373135
var1.mul_assign(&var10);
// 739 : 5884554933260632724324305917406316306558984880984735416503758277385983796206793528864667005039599422850711819889122125158632624337225148225439429446089080633033522156851311875569703343761280
square!(var1, 7);
// 746 : 5884554933260632724324305917406316306558984880984735416503758277385983796206793528864667005039599422850711819889122125158632624337225148225439429446089080633033522156851311875569703343761311
var1.mul_assign(&var11);
// 747 : 188305757864340247178377789357002121809887516191511533328120264876351481478617392923669344161267181531222778236451908005076243978791204743214061742274850580257072709019241980018230507000361952
square!(var1, 5);
// 752 : 188305757864340247178377789357002121809887516191511533328120264876351481478617392923669344161267181531222778236451908005076243978791204743214061742274850580257072709019241980018230507000361973
var1.mul_assign(&var4);
// 753 : 3012892125829443954854044629712033948958200259064184533249924238021623703657878286778709506580274904499564451783230528081219903660659275891424987876397609284113163344307871680291688112005791568
square!(var1, 4);
// 757 : 3012892125829443954854044629712033948958200259064184533249924238021623703657878286778709506580274904499564451783230528081219903660659275891424987876397609284113163344307871680291688112005791583
var1.mul_assign(&var10);
// 758 : 385650192106168826221317712603140345466649633160215620255990302466767834068208420707674816842275187775944249828253507594396147668564387314102398448178893988366484908071407575077336078336741322624
square!(var1, 7);
// 765 : 385650192106168826221317712603140345466649633160215620255990302466767834068208420707674816842275187775944249828253507594396147668564387314102398448178893988366484908071407575077336078336741322653
var1.mul_assign(&var8);
// 766 : 12340806147397402439082166803300491054932788261126899848191689678936570690182669462645594138952806008830215994504112243020676725394060394051276750341724607627727517058285042402474754506775722324896
square!(var1, 5);
// 771 : 12340806147397402439082166803300491054932788261126899848191689678936570690182669462645594138952806008830215994504112243020676725394060394051276750341724607627727517058285042402474754506775722324917
var1.mul_assign(&var4);
// 772 : 394905796716716878050629337705615713757849224356060795142134069725970262085845422804659012446489792282566911824131591776661655212609932609640856010935187444087280545865121356879192144216823114397344
square!(var1, 5);
// 777 : 394905796716716878050629337705615713757849224356060795142134069725970262085845422804659012446489792282566911824131591776661655212609932609640856010935187444087280545865121356879192144216823114397365
var1.mul_assign(&var4);
// 778 : 12636985494934940097620138806579702840251175179393945444548290231231048386747053529749088398287673353042141178372210936853172966803517843508507392349925998210792977467683883420134148614938339660715680
square!(var1, 5);
// 783 : 12636985494934940097620138806579702840251175179393945444548290231231048386747053529749088398287673353042141178372210936853172966803517843508507392349925998210792977467683883420134148614938339660715697
var1.mul_assign(&var9);
// 784 : 202191767918959041561922220905275245444018802870303127112772643699696774187952856475985414372602773648674258853955374989650767468856285496136118277598815971372687639482942134722146377839013434571451152
square!(var1, 4);
// 788 : 202191767918959041561922220905275245444018802870303127112772643699696774187952856475985414372602773648674258853955374989650767468856285496136118277598815971372687639482942134722146377839013434571451165
var1.mul_assign(&var5);
// 789 : 12940273146813378659963022137937615708417203383699400135217449196780593548028982814463066519846577513515152566653143999337649118006802271752711569766324222167852008926908296622217368181696859812572874560
square!(var1, 6);
// 795 : 12940273146813378659963022137937615708417203383699400135217449196780593548028982814463066519846577513515152566653143999337649118006802271752711569766324222167852008926908296622217368181696859812572874589
var1.mul_assign(&var8);
// 796 : 25880546293626757319926044275875231416834406767398800270434898393561187096057965628926133039693155027030305133306287998675298236013604543505423139532648444335704017853816593244434736363393719625145749178
var1 = var1.square();
// 797 : 25880546293626757319926044275875231416834406767398800270434898393561187096057965628926133039693155027030305133306287998675298236013604543505423139532648444335704017853816593244434736363393719625145749179
var1.mul_assign(var0);
// 798 : 1656354962792112468475266833656014810677402033113523217307833497187915974147709800251272514540361921729939528531602431915219087104870690784347080930089500437485057142644261967643823127257198056009327947456
square!(var1, 6);
// 804 : 1656354962792112468475266833656014810677402033113523217307833497187915974147709800251272514540361921729939528531602431915219087104870690784347080930089500437485057142644261967643823127257198056009327947463
var1.mul_assign(&var3);
// 805 : 1696107481899123167718673237663759166133659681908247774523221501120425957527254835457303054889330607851458077216360890281184345195387587363171410872411648447984698514067724254867274882311370809353551818202112
square!(var1, 10);
// 815 : 1696107481899123167718673237663759166133659681908247774523221501120425957527254835457303054889330607851458077216360890281184345195387587363171410872411648447984698514067724254867274882311370809353551818202135
var1.mul_assign(&var7);
// 816 : 108550878841543882733995087210480586632554219642127857569486176071707261281744309469267395512917158902493316941847096977995798092504805591242970295834345500671020704900334352311505592467927731798627316364936640
square!(var1, 6);
// 822 : 108550878841543882733995087210480586632554219642127857569486176071707261281744309469267395512917158902493316941847096977995798092504805591242970295834345500671020704900334352311505592467927731798627316364936661
var1.mul_assign(&var4);
// 823 : 6947256245858808494975685581470757544483470057096182884447115268589264722031635806033113312826698169759572284278214206591731077920307557839550098933398112042945325113621398547936357917947374835112148247355946304
square!(var1, 6);
// 829 : 6947256245858808494975685581470757544483470057096182884447115268589264722031635806033113312826698169759572284278214206591731077920307557839550098933398112042945325113621398547936357917947374835112148247355946329
var1.mul_assign(&var6);
// 830 : 444624399734963743678443877214128482846942083654155704604615377189712942210024691586119252020908682864612626193805709221870788986899683701731206331737479170748500807271769507067926906748631989447177487830780565056
square!(var1, 6);
// 836 : 444624399734963743678443877214128482846942083654155704604615377189712942210024691586119252020908682864612626193805709221870788986899683701731206331737479170748500807271769507067926906748631989447177487830780565069
var1.mul_assign(&var5);
// 837 : 28455961583037679595420408141704222902204293353865965094695384140141628301441580261511632129338155703335208076403565390199730495161579756910797205231198666927904051665393248452347322031912447324619359221169956164416
square!(var1, 6);
// 843 : 28455961583037679595420408141704222902204293353865965094695384140141628301441580261511632129338155703335208076403565390199730495161579756910797205231198666927904051665393248452347322031912447324619359221169956164437
var1.mul_assign(&var4);
// 844 : 238705906983162543355580399100765177871214152862586865721082456961065184302499251714358569373223087638243353151383559860752580829556389241459968722180074986980751351032731127113348364375477010926880553717580063640645533696
square!(var1, 23);
// 867 : 238705906983162543355580399100765177871214152862586865721082456961065184302499251714358569373223087638243353151383559860752580829556389241459968722180074986980751351032731127113348364375477010926880553717580063640645533703
var1.mul_assign(&var3);
// 868 : 15277178046922402774757145542448971383757705783205559406149277245508171795359952109718948439886277608847574601688547831088165173091608911453437998219524799166768086466094792135254295320030528699320355437925124073001314156992
square!(var1, 6);
// 874 : 15277178046922402774757145542448971383757705783205559406149277245508171795359952109718948439886277608847574601688547831088165173091608911453437998219524799166768086466094792135254295320030528699320355437925124073001314156999
var1.mul_assign(&var3);
// 875 : 488869697501516888792228657358367084280246585062577900996776871856261497451518467511006350076360883483122387254033530594821285538931485166510015943024793573336578766915033348328137450240976918378251374013603970336042053023968
square!(var1, 5);
// 880 : 488869697501516888792228657358367084280246585062577900996776871856261497451518467511006350076360883483122387254033530594821285538931485166510015943024793573336578766915033348328137450240976918378251374013603970336042053023971
var1.mul_assign(&var2);
// 881 : 31287660640097080882702634070935493393935781444004985663793719798800735836897181920704406404887096542919832784258145958068562274491615050656641020353586788693541041082562134293000796815422522776208087936870654101506691393534144
square!(var1, 6);
// 887 : 31287660640097080882702634070935493393935781444004985663793719798800735836897181920704406404887096542919832784258145958068562274491615050656641020353586788693541041082562134293000796815422522776208087936870654101506691393534151
var1.mul_assign(&var3);
// 888 : 1001205140483106588246484290269935788605945006208159541241399033561623546780709821462541004956387089373434649096260670658193992783731681621012512651314777238193313314641988297376025498093520728838658813979860931248214124593092832
square!(var1, 5);
// 893 : 1001205140483106588246484290269935788605945006208159541241399033561623546780709821462541004956387089373434649096260670658193992783731681621012512651314777238193313314641988297376025498093520728838658813979860931248214124593092835
var1 * var2
}
/// Tests for addition chains
#[cfg(test)]
mod tests {
use super::*;
use rand_core::SeedableRng;
const SEED: [u8; 16] = [
0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
0xe5,
];
#[test]
fn test_fp_chain() {
let mut rng = rand_xorshift::XorShiftRng::from_seed(SEED);
let p_m3_over4 = [
0xee7f_bfff_ffff_eaaa,
0x07aa_ffff_ac54_ffff,
0xd9cc_34a8_3dac_3d89,
0xd91d_d2e1_3ce1_44af,
0x92c6_e9ed_90d2_eb35,
0x0680_447a_8e5f_f9a6,
];
for _ in 0..32 {
let input = Fp::random(&mut rng);
assert_eq!(chain_pm3div4(&input), input.pow_vartime(&p_m3_over4));
}
}
#[test]
fn test_fp2_chain() {
let mut rng = rand_xorshift::XorShiftRng::from_seed(SEED);
let p_sq_m9_over16 = [
0xb26a_a000_01c7_18e3,
0xd7ce_d6b1_d763_82ea,
0x3162_c338_3621_13cf,
0x966b_f91e_d3e7_1b74,
0xb292_e85a_8709_1a04,
0x11d6_8619_c861_85c7,
0xef53_1493_3097_8ef0,
0x050a_62cf_d16d_dca6,
0x466e_59e4_9349_e8bd,
0x9e2d_c90e_50e7_046b,
0x74bd_278e_aa22_f25e,
0x002a_437a_4b8c_35fc,
];
for _ in 0..32 {
let input = Fp2::random(&mut rng);
assert_eq!(
chain_p2m9div16(&input),
input.pow_vartime_extended(&p_sq_m9_over16[..]),
);
}
}
}