1 // -*- mode: rust; -*-
2 //
3 // This file is part of curve25519-dalek.
4 // Copyright (c) 2018-2019 Henry de Valence
5 // See LICENSE for licensing information.
6 //
7 // Authors:
8 // - Henry de Valence <hdevalence@hdevalence.ca>
9 
10 //! This module contains constants used by the IFMA backend.
11 
12 use packed_simd::u64x4;
13 
14 use window::NafLookupTable8;
15 
16 use super::edwards::{CachedPoint, ExtendedPoint};
17 use super::field::{F51x4Reduced, F51x4Unreduced};
18 
19 /// The identity element as an `ExtendedPoint`.
20 pub(crate) static EXTENDEDPOINT_IDENTITY: ExtendedPoint = ExtendedPoint(F51x4Unreduced([
21     u64x4::new(0, 1, 1, 0),
22     u64x4::new(0, 0, 0, 0),
23     u64x4::new(0, 0, 0, 0),
24     u64x4::new(0, 0, 0, 0),
25     u64x4::new(0, 0, 0, 0),
26 ]));
27 
28 /// The identity element as a `CachedPoint`.
29 pub(crate) static CACHEDPOINT_IDENTITY: CachedPoint = CachedPoint(F51x4Reduced([
30     u64x4::new(121647, 121666, 243332, 2251799813685229),
31     u64x4::new(2251799813685248, 0, 0, 2251799813685247),
32     u64x4::new(2251799813685247, 0, 0, 2251799813685247),
33     u64x4::new(2251799813685247, 0, 0, 2251799813685247),
34     u64x4::new(2251799813685247, 0, 0, 2251799813685247),
35 ]));
36 
37 /// Odd multiples of the Ed25519 basepoint:
38 pub(crate) static BASEPOINT_ODD_LOOKUP_TABLE: NafLookupTable8<CachedPoint> = NafLookupTable8([
39     CachedPoint(F51x4Reduced([
40         u64x4::new(1277522120965857, 73557767439946, 243332, 1943719795065404),
41         u64x4::new(108375142003455, 341984820733594, 0, 2097709862669256),
42         u64x4::new(150073485536043, 750646439938056, 0, 581130035634455),
43         u64x4::new(2149983732744869, 1903255931888577, 0, 646644904824193),
44         u64x4::new(291045673509296, 1060034214701851, 0, 325245010451737),
45     ])),
46     CachedPoint(F51x4Reduced([
47         u64x4::new(
48             1970681836121889,
49             1660307753655178,
50             1077207637163462,
51             1436413309977108,
52         ),
53         u64x4::new(
54             158785710838757,
55             919645875412951,
56             174577133496574,
57             2213787394009350,
58         ),
59         u64x4::new(
60             1017606396438281,
61             1240932851489554,
62             918203302506967,
63             1239827708070863,
64         ),
65         u64x4::new(
66             1748989883612327,
67             1745367742532782,
68             1168385548387,
69             1211387683826673,
70         ),
71         u64x4::new(
72             799349980018733,
73             1471088235739693,
74             1505351346057417,
75             2104975925096407,
76         ),
77     ])),
78     CachedPoint(F51x4Reduced([
79         u64x4::new(
80             171437462972293,
81             36016853025886,
82             1184164975342640,
83             1633525003912147,
84         ),
85         u64x4::new(
86             2113383632509037,
87             1946216474924125,
88             1884174984466256,
89             1373317790955847,
90         ),
91         u64x4::new(
92             791293623466401,
93             1796466048084189,
94             444977763198796,
95             629823271230872,
96         ),
97         u64x4::new(
98             1093217720067380,
99             2157024270666135,
100             238122980108466,
101             806820763806847,
102         ),
103         u64x4::new(
104             793658959468458,
105             368578641413741,
106             11592529764159,
107             2144017075993471,
108         ),
109     ])),
110     CachedPoint(F51x4Reduced([
111         u64x4::new(
112             1538027396670268,
113             1588896993892061,
114             675619548648376,
115             788373514423313,
116         ),
117         u64x4::new(
118             1987517656073805,
119             1940987929951188,
120             666993851697339,
121             2040540928108427,
122         ),
123         u64x4::new(
124             375514548584082,
125             1726008037083790,
126             1070069155000872,
127             570111103756303,
128         ),
129         u64x4::new(
130             772223645372213,
131             2123395244967674,
132             868238486911408,
133             1846639042240362,
134         ),
135         u64x4::new(
136             872865734460736,
137             32277956842850,
138             1701451131455402,
139             773883376061880,
140         ),
141     ])),
142     CachedPoint(F51x4Reduced([
143         u64x4::new(
144             1845177363882902,
145             275858237213625,
146             1052127336883600,
147             171072805852218,
148         ),
149         u64x4::new(
150             139016783952609,
151             462699304987089,
152             430046471494974,
153             410922720999257,
154         ),
155         u64x4::new(
156             846403935976337,
157             243817706931454,
158             971825428236901,
159             571800039596794,
160         ),
161         u64x4::new(
162             807642685434918,
163             1933536976438782,
164             812324278898440,
165             688391556487313,
166         ),
167         u64x4::new(
168             76239450396192,
169             629532732688863,
170             1833302026979779,
171             650067934544499,
172         ),
173     ])),
174     CachedPoint(F51x4Reduced([
175         u64x4::new(
176             1373931604989264,
177             331159264656614,
178             364391529321767,
179             874765630865409,
180         ),
181         u64x4::new(
182             2109908262150241,
183             473400816504190,
184             91544045127333,
185             976307977609515,
186         ),
187         u64x4::new(
188             330175435673491,
189             2126511895885904,
190             1022944071588421,
191             2158480209801463,
192         ),
193         u64x4::new(
194             1305666795527971,
195             162063591028664,
196             2193154870675382,
197             1789166662611800,
198         ),
199         u64x4::new(
200             817858592500508,
201             1672743239440202,
202             859976879916778,
203             1167423340862516,
204         ),
205     ])),
206     CachedPoint(F51x4Reduced([
207         u64x4::new(
208             274334925170164,
209             565841102587251,
210             603083835949120,
211             607539210240861,
212         ),
213         u64x4::new(
214             196754662972649,
215             1339063476699167,
216             1406077076979491,
217             896902435668469,
218         ),
219         u64x4::new(
220             397962210956733,
221             174839587476217,
222             1381082665748936,
223             175195877334136,
224         ),
225         u64x4::new(
226             717429432748391,
227             1635309821746318,
228             363374010274647,
229             882908746261699,
230         ),
231         u64x4::new(
232             600946602802781,
233             1946596133370711,
234             1532135183320341,
235             690530671668253,
236         ),
237     ])),
238     CachedPoint(F51x4Reduced([
239         u64x4::new(
240             2074443704000945,
241             2163534804938345,
242             425423840926528,
243             1100826171404853,
244         ),
245         u64x4::new(
246             111700142796101,
247             1456893872751964,
248             1186145518682968,
249             2192182627706116,
250         ),
251         u64x4::new(
252             1848722121856066,
253             2123239575044749,
254             1323870754599272,
255             883211262889775,
256         ),
257         u64x4::new(
258             938263017712916,
259             689670293631396,
260             183944529557576,
261             501908638166580,
262         ),
263         u64x4::new(
264             2170571907220631,
265             36636756989655,
266             1875035480138608,
267             803703278398018,
268         ),
269     ])),
270     CachedPoint(F51x4Reduced([
271         u64x4::new(
272             1053429956874064,
273             1636640618139765,
274             1556890827801070,
275             2142720579528828,
276         ),
277         u64x4::new(
278             1814240918422814,
279             692326274601777,
280             1054896561802157,
281             2025454041705534,
282         ),
283         u64x4::new(
284             2109495823888757,
285             1287497869997176,
286             194170063200096,
287             621116840113213,
288         ),
289         u64x4::new(
290             2156505873679998,
291             2197064359737385,
292             1312887672223536,
293             369862818895912,
294         ),
295         u64x4::new(
296             977381163563657,
297             1878897311974033,
298             2144566861359744,
299             1832960882773351,
300         ),
301     ])),
302     CachedPoint(F51x4Reduced([
303         u64x4::new(
304             1266492498289486,
305             1301524759372145,
306             324789537938521,
307             442710471023019,
308         ),
309         u64x4::new(
310             1232722320001345,
311             1191193089162455,
312             176474006074813,
313             2158950213252857,
314         ),
315         u64x4::new(
316             1901782191467749,
317             494791441598902,
318             1820415815322129,
319             854954583485223,
320         ),
321         u64x4::new(
322             1511383667649702,
323             792536415032464,
324             2027741263854728,
325             1727944381044738,
326         ),
327         u64x4::new(
328             606355788891204,
329             1670687521471220,
330             582824350365415,
331             1509135066079912,
332         ),
333     ])),
334     CachedPoint(F51x4Reduced([
335         u64x4::new(
336             1079942762813598,
337             2015830004785901,
338             479916361323351,
339             1907956590950158,
340         ),
341         u64x4::new(
342             2053400302939156,
343             1319799126867070,
344             19493088767391,
345             1908755581402373,
346         ),
347         u64x4::new(
348             2235858054780980,
349             885832711204321,
350             810332865560178,
351             103174191215441,
352         ),
353         u64x4::new(
354             1843466881032833,
355             355511728384038,
356             693846715794114,
357             186545012724117,
358         ),
359         u64x4::new(
360             1661758432892509,
361             1491022339899281,
362             698941123765263,
363             174945407208560,
364         ),
365     ])),
366     CachedPoint(F51x4Reduced([
367         u64x4::new(
368             1075933251927831,
369             400263885306647,
370             1308157532880528,
371             347933379126665,
372         ),
373         u64x4::new(
374             673811632329433,
375             1584860147186478,
376             271778891257244,
377             498194055154207,
378         ),
379         u64x4::new(
380             703783427747558,
381             1051624728592032,
382             1371463103351544,
383             230351033002960,
384         ),
385         u64x4::new(
386             860729466483372,
387             421647596766583,
388             1520613871336707,
389             635298775280054,
390         ),
391         u64x4::new(
392             1168352891728845,
393             1691216293752089,
394             1799491997061519,
395             399728882318504,
396         ),
397     ])),
398     CachedPoint(F51x4Reduced([
399         u64x4::new(
400             420156727446514,
401             1483649215777128,
402             165508610199900,
403             1918121104840431,
404         ),
405         u64x4::new(
406             2129902293682427,
407             730952770435213,
408             2184527544565390,
409             1939880362232986,
410         ),
411         u64x4::new(
412             1771978364905086,
413             510975579746524,
414             927564335219142,
415             177574146260558,
416         ),
417         u64x4::new(
418             2164104536437514,
419             1532598873799015,
420             406875369182421,
421             1367005937406517,
422         ),
423         u64x4::new(
424             35073200082587,
425             1981124717036219,
426             1854087014063833,
427             122419694385217,
428         ),
429     ])),
430     CachedPoint(F51x4Reduced([
431         u64x4::new(
432             1963785875777739,
433             411497142699119,
434             1974557512687408,
435             1268304422747183,
436         ),
437         u64x4::new(
438             762752575978150,
439             1443822019541748,
440             1331556159904338,
441             377726798263780,
442         ),
443         u64x4::new(
444             825953972847841,
445             353487068141356,
446             1955697322427207,
447             2048226560172078,
448         ),
449         u64x4::new(
450             1482378558684434,
451             657691905625918,
452             923870001994493,
453             1694132799397736,
454         ),
455         u64x4::new(
456             1643904759603122,
457             170495566698285,
458             1218312703413378,
459             784318735038131,
460         ),
461     ])),
462     CachedPoint(F51x4Reduced([
463         u64x4::new(
464             939230507241903,
465             2238763473105245,
466             1827325199528162,
467             1153939339775538,
468         ),
469         u64x4::new(
470             38544505283339,
471             258889431497015,
472             351721979677947,
473             1357907379592829,
474         ),
475         u64x4::new(
476             1393974676373341,
477             1131355528938676,
478             473104915298872,
479             978783482501776,
480         ),
481         u64x4::new(
482             2131516168980501,
483             2113911780991092,
484             1477027502354261,
485             542884524860340,
486         ),
487         u64x4::new(
488             1029606261349423,
489             64226378557628,
490             1669131167474348,
491             2212808057234874,
492         ),
493     ])),
494     CachedPoint(F51x4Reduced([
495         u64x4::new(
496             1423176501543193,
497             163313632579593,
498             2220495688893001,
499             2220041045291870,
500         ),
501         u64x4::new(
502             1111834224023697,
503             1026815658023689,
504             1404605100939775,
505             1412149108248227,
506         ),
507         u64x4::new(
508             1542537854906076,
509             1270288391129127,
510             991419278941933,
511             1824939809581980,
512         ),
513         u64x4::new(
514             1142003215657891,
515             525980550896367,
516             1508270666157963,
517             917719462309053,
518         ),
519         u64x4::new(
520             400851268057105,
521             1620818232405188,
522             1251478578139510,
523             2162841805361886,
524         ),
525     ])),
526     CachedPoint(F51x4Reduced([
527         u64x4::new(
528             2125383272208441,
529             1368790097335984,
530             11813369275978,
531             639513785921674,
532         ),
533         u64x4::new(
534             2200806265616284,
535             1041996387620216,
536             1275149397833084,
537             1723371028064068,
538         ),
539         u64x4::new(
540             603720163891275,
541             2135593511176153,
542             2049641644431548,
543             1198460677818310,
544         ),
545         u64x4::new(
546             1862491879401621,
547             2008116580769441,
548             626566325260235,
549             1058308304975798,
550         ),
551         u64x4::new(
552             628557314314858,
553             1075323332046522,
554             1631772244117095,
555             1812174547405683,
556         ),
557     ])),
558     CachedPoint(F51x4Reduced([
559         u64x4::new(
560             1222773123817104,
561             363276129291452,
562             796237592807883,
563             1914425291893078,
564         ),
565         u64x4::new(
566             1721259057429088,
567             734941709009373,
568             1553365830564638,
569             1492120931079419,
570         ),
571         u64x4::new(
572             1009354843273686,
573             293884504384873,
574             1050281954944357,
575             134132942667344,
576         ),
577         u64x4::new(
578             23119363298711,
579             1694754778833445,
580             1725925193393496,
581             1738396998222001,
582         ),
583         u64x4::new(
584             1753692057254667,
585             118428526447110,
586             840961387840295,
587             1227619055408558,
588         ),
589     ])),
590     CachedPoint(F51x4Reduced([
591         u64x4::new(
592             1004186117579547,
593             508771992330056,
594             1426571663072421,
595             2238524171903259,
596         ),
597         u64x4::new(
598             744764613007812,
599             398885442368825,
600             2047459490294949,
601             2141797621077959,
602         ),
603         u64x4::new(
604             4556204156489,
605             1708213022802363,
606             1071381560923933,
607             393474529142567,
608         ),
609         u64x4::new(
610             350116198213005,
611             945907227204695,
612             168267474358731,
613             1801504420122711,
614         ),
615         u64x4::new(
616             728788674520360,
617             1262722049156121,
618             455259596607008,
619             1159442365834489,
620         ),
621     ])),
622     CachedPoint(F51x4Reduced([
623         u64x4::new(
624             2226818917892677,
625             185673745808179,
626             2240952219732549,
627             324137961621908,
628         ),
629         u64x4::new(
630             1659527641857410,
631             973964060249383,
632             1349692151487730,
633             1172743533370593,
634         ),
635         u64x4::new(
636             310591478467746,
637             2123977244137170,
638             774562885265820,
639             430035546191685,
640         ),
641         u64x4::new(
642             2150863173197992,
643             2101978317708856,
644             193592648406011,
645             1375328504508580,
646         ),
647         u64x4::new(
648             1946235834250479,
649             121741431658675,
650             1004342690620100,
651             2063466488599450,
652         ),
653     ])),
654     CachedPoint(F51x4Reduced([
655         u64x4::new(
656             463079632200153,
657             40415275714025,
658             545935352782679,
659             1458043501600908,
660         ),
661         u64x4::new(
662             783771976559993,
663             880839641726471,
664             1782028201271831,
665             41664413404590,
666         ),
667         u64x4::new(
668             985129151724159,
669             187728621410000,
670             16620051933318,
671             378011085567733,
672         ),
673         u64x4::new(
674             1820372198168638,
675             905710046480679,
676             1912961774249737,
677             1868135861067161,
678         ),
679         u64x4::new(
680             474460473983187,
681             1455684425673661,
682             652771171116843,
683             733511920760779,
684         ),
685     ])),
686     CachedPoint(F51x4Reduced([
687         u64x4::new(
688             1088886980746809,
689             1660218575261626,
690             527921875040240,
691             915086639857889,
692         ),
693         u64x4::new(
694             1814735788528175,
695             1586698876186367,
696             2040856637532862,
697             405684812785624,
698         ),
699         u64x4::new(
700             658578559700999,
701             1751442070931114,
702             1293623371490094,
703             715026719042518,
704         ),
705         u64x4::new(
706             382156225644820,
707             897982285504960,
708             577673183555858,
709             1158728558309719,
710         ),
711         u64x4::new(
712             1865791902475663,
713             124491617513788,
714             758484125168765,
715             734065580770143,
716         ),
717     ])),
718     CachedPoint(F51x4Reduced([
719         u64x4::new(
720             330985690350617,
721             2214424721795630,
722             973374650780848,
723             1507267060932964,
724         ),
725         u64x4::new(
726             1733823971011290,
727             1730742552292995,
728             669018866977489,
729             604527664126146,
730         ),
731         u64x4::new(
732             1082092498645474,
733             1029182053935309,
734             756799947765834,
735             1764720030308351,
736         ),
737         u64x4::new(
738             969912105693756,
739             38116887248276,
740             2148030115687613,
741             995140534653865,
742         ),
743         u64x4::new(
744             2154373397460354,
745             298128883464656,
746             479587543632539,
747             1061127201140779,
748         ),
749     ])),
750     CachedPoint(F51x4Reduced([
751         u64x4::new(
752             843064865526549,
753             2019481782959016,
754             1873125524281672,
755             2013330239022371,
756         ),
757         u64x4::new(
758             1192932403815186,
759             1818108671859220,
760             1247005102016258,
761             1210577394628058,
762         ),
763         u64x4::new(
764             132359273326717,
765             795492788299178,
766             1235924489372816,
767             891705064411550,
768         ),
769         u64x4::new(
770             1425833709104858,
771             152114045731085,
772             991347902581315,
773             1387773338707683,
774         ),
775         u64x4::new(
776             48024203807922,
777             157005564892977,
778             1474053161953744,
779             727448023498345,
780         ),
781     ])),
782     CachedPoint(F51x4Reduced([
783         u64x4::new(
784             1076621484026788,
785             1309917234320927,
786             1786998180233659,
787             1595497085944737,
788         ),
789         u64x4::new(
790             1737334672694726,
791             2038133716999447,
792             1929061192400917,
793             620544235219084,
794         ),
795         u64x4::new(
796             1550527313469747,
797             329096759623509,
798             1585214659209474,
799             693419841748324,
800         ),
801         u64x4::new(
802             1450010875912315,
803             2085047082180569,
804             757421110771886,
805             389367139787400,
806         ),
807         u64x4::new(
808             781339490566117,
809             132941783448971,
810             258650459725225,
811             2042274962585613,
812         ),
813     ])),
814     CachedPoint(F51x4Reduced([
815         u64x4::new(
816             859638991542650,
817             2249840007426442,
818             1138753070862357,
819             793751342318913,
820         ),
821         u64x4::new(
822             2133476133447306,
823             1027010646129239,
824             436851910892865,
825             866949948830344,
826         ),
827         u64x4::new(
828             1936003572431223,
829             531513680252193,
830             1929877059408416,
831             830585477662503,
832         ),
833         u64x4::new(
834             1460760405777960,
835             686673748420916,
836             275475330051554,
837             1581792376993692,
838         ),
839         u64x4::new(
840             894482039456784,
841             1801274480988632,
842             16407898635278,
843             1668497039215206,
844         ),
845     ])),
846     CachedPoint(F51x4Reduced([
847         u64x4::new(
848             258585746227669,
849             936490904651492,
850             1826793887434108,
851             1201219990633823,
852         ),
853         u64x4::new(
854             979462791643635,
855             461762372210187,
856             218708929991480,
857             1378150755760178,
858         ),
859         u64x4::new(
860             642542170229970,
861             787135445552820,
862             371168855880557,
863             182642566486693,
864         ),
865         u64x4::new(
866             1152277399721904,
867             1726910452705576,
868             1452393215705343,
869             2117799581546845,
870         ),
871         u64x4::new(
872             1211265143925330,
873             14373046151823,
874             1745528818271507,
875             1842106288572078,
876         ),
877     ])),
878     CachedPoint(F51x4Reduced([
879         u64x4::new(
880             635154614562157,
881             1956763034454109,
882             509123035953043,
883             445727657534780,
884         ),
885         u64x4::new(
886             2072765509783252,
887             1282639891593570,
888             1075086397362049,
889             722996110178195,
890         ),
891         u64x4::new(
892             1385572918825603,
893             1190035835509576,
894             218317841176013,
895             1047865370756924,
896         ),
897         u64x4::new(
898             473991569426488,
899             1910588123704592,
900             1338270051770806,
901             401676861680875,
902         ),
903         u64x4::new(
904             992455353618436,
905             126422733426929,
906             1955248037756399,
907             119233843022643,
908         ),
909     ])),
910     CachedPoint(F51x4Reduced([
911         u64x4::new(
912             1555272991526078,
913             2214378187116349,
914             366893798097444,
915             1401502118355702,
916         ),
917         u64x4::new(
918             1157229521930713,
919             2144787187506262,
920             1681597469697840,
921             847499096518697,
922         ),
923         u64x4::new(
924             1872802655800758,
925             1027119609820793,
926             1137278714788290,
927             1664750301179485,
928         ),
929         u64x4::new(
930             1091289858897030,
931             910126419483563,
932             1101920147235731,
933             597083075893952,
934         ),
935         u64x4::new(
936             1711011533670315,
937             185206680336278,
938             1620960612579784,
939             1968598849170880,
940         ),
941     ])),
942     CachedPoint(F51x4Reduced([
943         u64x4::new(
944             73077300235958,
945             257216723095630,
946             466947267713785,
947             847105214181598,
948         ),
949         u64x4::new(
950             1322905631406309,
951             407458059314731,
952             230045063190376,
953             923800751267786,
954         ),
955         u64x4::new(
956             1146027205000415,
957             1541328763727623,
958             768510249199119,
959             1630223587589059,
960         ),
961         u64x4::new(
962             1930368769879433,
963             1376145403022159,
964             1898149855343131,
965             1709421930518180,
966         ),
967         u64x4::new(
968             633944191571764,
969             58314960742839,
970             2050971151574988,
971             757799756090059,
972         ),
973     ])),
974     CachedPoint(F51x4Reduced([
975         u64x4::new(
976             361576929158539,
977             1035682890165818,
978             160945739362874,
979             266975208626222,
980         ),
981         u64x4::new(
982             1635371797076046,
983             2106722851965197,
984             451585919077206,
985             6692426667180,
986         ),
987         u64x4::new(
988             175820543533852,
989             2057511393764025,
990             1531846543720469,
991             1648320903946519,
992         ),
993         u64x4::new(
994             947461770620940,
995             1107335044817620,
996             1725565474111216,
997             2182263619949220,
998         ),
999         u64x4::new(
1000             726444888601221,
1001             1379664085279206,
1002             1517215633290417,
1003             1763968936542507,
1004         ),
1005     ])),
1006     CachedPoint(F51x4Reduced([
1007         u64x4::new(
1008             686545355846512,
1009             1712283265573167,
1010             1743509592736302,
1011             1653906616429153,
1012         ),
1013         u64x4::new(
1014             985108805667149,
1015             2244347650874753,
1016             1304749057936860,
1017             321846134330589,
1018         ),
1019         u64x4::new(
1020             296321076156886,
1021             1717929256240029,
1022             450933772486425,
1023             2015536856431605,
1024         ),
1025         u64x4::new(
1026             1690393512821866,
1027             646913049470189,
1028             2198650647576397,
1029             1230646705710442,
1030         ),
1031         u64x4::new(
1032             601961913448442,
1033             878806578800541,
1034             620497587492381,
1035             330716414244629,
1036         ),
1037     ])),
1038     CachedPoint(F51x4Reduced([
1039         u64x4::new(
1040             631510982676132,
1041             1755753187697174,
1042             1596201246674299,
1043             2197888384902121,
1044         ),
1045         u64x4::new(
1046             626957678275745,
1047             1447583371478595,
1048             1375375216702128,
1049             1443613232818823,
1050         ),
1051         u64x4::new(
1052             1962997804660501,
1053             1051744123184519,
1054             1002558639300437,
1055             1237313314603385,
1056         ),
1057         u64x4::new(
1058             2118828335274995,
1059             226398203764759,
1060             889099617161107,
1061             1620967117678504,
1062         ),
1063         u64x4::new(
1064             227261019362935,
1065             2046897556746842,
1066             591524060355369,
1067             2178552047369691,
1068         ),
1069     ])),
1070     CachedPoint(F51x4Reduced([
1071         u64x4::new(
1072             1375403119051662,
1073             222313965014452,
1074             539873444241395,
1075             213198095917915,
1076         ),
1077         u64x4::new(
1078             1436952871599114,
1079             1229749762725246,
1080             1174441562267670,
1081             265367077740349,
1082         ),
1083         u64x4::new(
1084             11107426165917,
1085             985954476039181,
1086             1147329112365579,
1087             1133931640328107,
1088         ),
1089         u64x4::new(
1090             585235055006843,
1091             699515259687482,
1092             299559608721134,
1093             2134819767146767,
1094         ),
1095         u64x4::new(
1096             1376401105588528,
1097             391412107507860,
1098             302743651807545,
1099             1362834426455518,
1100         ),
1101     ])),
1102     CachedPoint(F51x4Reduced([
1103         u64x4::new(
1104             1802940904616205,
1105             1615132760193234,
1106             869321663313735,
1107             666494072545310,
1108         ),
1109         u64x4::new(
1110             1452849320020701,
1111             1472716813676364,
1112             472862999490802,
1113             359937983286145,
1114         ),
1115         u64x4::new(
1116             1221198323133843,
1117             491718521756528,
1118             1387135774113906,
1119             793779904904008,
1120         ),
1121         u64x4::new(
1122             1032129287829151,
1123             30730741946697,
1124             217603185195068,
1125             2118169309744162,
1126         ),
1127         u64x4::new(
1128             225899335574721,
1129             1767553399797342,
1130             881082465669982,
1131             1435383196392870,
1132         ),
1133     ])),
1134     CachedPoint(F51x4Reduced([
1135         u64x4::new(
1136             1127093564374276,
1137             2245188499702906,
1138             1250041622887441,
1139             2179324911668149,
1140         ),
1141         u64x4::new(
1142             908019210866875,
1143             1879900391060964,
1144             1355047706206597,
1145             647218945377302,
1146         ),
1147         u64x4::new(
1148             1616265604422592,
1149             2134336781521657,
1150             1157711219915601,
1151             1227494173135033,
1152         ),
1153         u64x4::new(
1154             136450294813355,
1155             1984543542455033,
1156             1199486053011083,
1157             33687889941331,
1158         ),
1159         u64x4::new(
1160             1053447012707371,
1161             68239344331930,
1162             537448158443925,
1163             1829189783369646,
1164         ),
1165     ])),
1166     CachedPoint(F51x4Reduced([
1167         u64x4::new(
1168             996806463322563,
1169             2043104667851348,
1170             1110361398300309,
1171             1218740346887957,
1172         ),
1173         u64x4::new(
1174             399141907016839,
1175             1307691109658227,
1176             532535384961264,
1177             896201194398872,
1178         ),
1179         u64x4::new(
1180             111705272106160,
1181             1790972382466021,
1182             1159338112559144,
1183             303544352897203,
1184         ),
1185         u64x4::new(
1186             1036600573322969,
1187             1457119922663674,
1188             334117653665514,
1189             460023361701263,
1190         ),
1191         u64x4::new(
1192             1363773215189933,
1193             1915594049343802,
1194             1661249423378694,
1195             1744945551969247,
1196         ),
1197     ])),
1198     CachedPoint(F51x4Reduced([
1199         u64x4::new(
1200             3093919631215,
1201             574886478077610,
1202             1704446919728971,
1203             250093147254210,
1204         ),
1205         u64x4::new(
1206             1387413348737796,
1207             360142717826981,
1208             2116185073015983,
1209             474541388374100,
1210         ),
1211         u64x4::new(
1212             1632539630892580,
1213             1332404016215719,
1214             2145297637794728,
1215             1289783723173504,
1216         ),
1217         u64x4::new(
1218             1030244179060173,
1219             579782698595797,
1220             1062365251139982,
1221             677149839815546,
1222         ),
1223         u64x4::new(
1224             6671539419876,
1225             1426937459653775,
1226             406942403696343,
1227             675479224223817,
1228         ),
1229     ])),
1230     CachedPoint(F51x4Reduced([
1231         u64x4::new(
1232             271984148441782,
1233             1708099625818957,
1234             1499011822959235,
1235             516808451044836,
1236         ),
1237         u64x4::new(
1238             1124847751346323,
1239             2038336022958449,
1240             1721698491022600,
1241             705944403212572,
1242         ),
1243         u64x4::new(
1244             85459783780275,
1245             1715213099986669,
1246             1728445509034791,
1247             730657630359717,
1248         ),
1249         u64x4::new(
1250             1185034652652387,
1251             755472578204310,
1252             476118360897817,
1253             1800434542785310,
1254         ),
1255         u64x4::new(
1256             1815589628676941,
1257             491778500674079,
1258             1547664984392513,
1259             279891608681267,
1260         ),
1261     ])),
1262     CachedPoint(F51x4Reduced([
1263         u64x4::new(
1264             2036337168672113,
1265             1730787524684269,
1266             639134121311693,
1267             698060925015524,
1268         ),
1269         u64x4::new(
1270             315211075189491,
1271             1329055848835358,
1272             688621136402134,
1273             1271193060119448,
1274         ),
1275         u64x4::new(
1276             1697984374314012,
1277             459330773536457,
1278             305481314707918,
1279             61676911066002,
1280         ),
1281         u64x4::new(
1282             2166631826859191,
1283             2105217187401781,
1284             937587962768434,
1285             357397435365683,
1286         ),
1287         u64x4::new(
1288             1206757093145471,
1289             1287847622009294,
1290             1951336140421622,
1291             2233789834777410,
1292         ),
1293     ])),
1294     CachedPoint(F51x4Reduced([
1295         u64x4::new(
1296             82144190081093,
1297             1568417433687791,
1298             907555979158442,
1299             2037855062523867,
1300         ),
1301         u64x4::new(
1302             1225315484058853,
1303             315317868015613,
1304             1765025920288384,
1305             175223259828436,
1306         ),
1307         u64x4::new(
1308             1215010304871271,
1309             662713408454950,
1310             429517658575616,
1311             991062684008811,
1312         ),
1313         u64x4::new(
1314             993837615254894,
1315             1485561584889450,
1316             2001836754226476,
1317             1915943063896801,
1318         ),
1319         u64x4::new(
1320             818895101625673,
1321             1342479472068804,
1322             1380235330010671,
1323             23315169761453,
1324         ),
1325     ])),
1326     CachedPoint(F51x4Reduced([
1327         u64x4::new(
1328             1500726307559118,
1329             956166860173424,
1330             512663951564436,
1331             1940180717699824,
1332         ),
1333         u64x4::new(
1334             1789521472720825,
1335             779456898652427,
1336             2035063615853504,
1337             863582140589407,
1338         ),
1339         u64x4::new(
1340             634508890793787,
1341             1748041666732214,
1342             259642099961634,
1343             1294936839797812,
1344         ),
1345         u64x4::new(
1346             2183334898697038,
1347             2197242820694806,
1348             2217225409073703,
1349             992633998226449,
1350         ),
1351         u64x4::new(
1352             2197077498155916,
1353             1562008797791883,
1354             1395088759904208,
1355             331715244679294,
1356         ),
1357     ])),
1358     CachedPoint(F51x4Reduced([
1359         u64x4::new(
1360             186854731652320,
1361             284389440026580,
1362             1252175415119400,
1363             1025377410100223,
1364         ),
1365         u64x4::new(
1366             1578732129417607,
1367             898645497852382,
1368             2237766074482974,
1369             1939197790303592,
1370         ),
1371         u64x4::new(
1372             1438830390640145,
1373             1682452015845597,
1374             1108441197232223,
1375             1984134492898664,
1376         ),
1377         u64x4::new(
1378             282668727301669,
1379             1609018289552856,
1380             390363439795705,
1381             1138459124667912,
1382         ),
1383         u64x4::new(
1384             18889015928490,
1385             532489638086725,
1386             324621535996080,
1387             2210046082697453,
1388         ),
1389     ])),
1390     CachedPoint(F51x4Reduced([
1391         u64x4::new(
1392             2041327051605378,
1393             2244037852176483,
1394             2116336876147147,
1395             9616672544864,
1396         ),
1397         u64x4::new(
1398             969847387559191,
1399             1059119127679639,
1400             1764630094670633,
1401             364568045311834,
1402         ),
1403         u64x4::new(
1404             505938893153679,
1405             2075421412172902,
1406             326984153045666,
1407             1959549727324704,
1408         ),
1409         u64x4::new(
1410             1088715617911260,
1411             13917085151028,
1412             950568481355929,
1413             23687195265771,
1414         ),
1415         u64x4::new(
1416             1798284568673198,
1417             808382292203333,
1418             2214698741961545,
1419             610817203275867,
1420         ),
1421     ])),
1422     CachedPoint(F51x4Reduced([
1423         u64x4::new(
1424             1731488929623777,
1425             1158815615106413,
1426             1491090861948525,
1427             1428384712900962,
1428         ),
1429         u64x4::new(
1430             722237139522457,
1431             1514290328911535,
1432             1366197913116230,
1433             1519472657321210,
1434         ),
1435         u64x4::new(
1436             246028966932273,
1437             1888239319448405,
1438             423720022211163,
1439             455243905681470,
1440         ),
1441         u64x4::new(
1442             738323403716001,
1443             1758018973481179,
1444             1180718299482318,
1445             1008495946606708,
1446         ),
1447         u64x4::new(
1448             334959381596119,
1449             1704599537529481,
1450             2172191232106896,
1451             13502508918495,
1452         ),
1453     ])),
1454     CachedPoint(F51x4Reduced([
1455         u64x4::new(
1456             273393076768079,
1457             427388720298603,
1458             1071733376018227,
1459             1715429388968611,
1460         ),
1461         u64x4::new(
1462             751776629892313,
1463             1965239102856011,
1464             541955408230119,
1465             831043488876080,
1466         ),
1467         u64x4::new(
1468             643718536393104,
1469             390543998404644,
1470             2176730661486279,
1471             499459234889079,
1472         ),
1473         u64x4::new(
1474             1482404333915009,
1475             865527293526285,
1476             507957951411713,
1477             216456252558825,
1478         ),
1479         u64x4::new(
1480             2210281256300231,
1481             1519357818277551,
1482             1257866936775246,
1483             1689605217672864,
1484         ),
1485     ])),
1486     CachedPoint(F51x4Reduced([
1487         u64x4::new(
1488             2135395168187905,
1489             2214400157568614,
1490             2032983817870823,
1491             1124945109072647,
1492         ),
1493         u64x4::new(
1494             1602820011758145,
1495             906675633903289,
1496             782700735390986,
1497             2067218823525601,
1498         ),
1499         u64x4::new(
1500             786785748926382,
1501             1433583123655616,
1502             905839404290873,
1503             2249680349963778,
1504         ),
1505         u64x4::new(
1506             1940824582370584,
1507             1610961256326291,
1508             285307858781375,
1509             1755588655461194,
1510         ),
1511         u64x4::new(
1512             233682812055333,
1513             2146114223476434,
1514             41132209533476,
1515             535292431776371,
1516         ),
1517     ])),
1518     CachedPoint(F51x4Reduced([
1519         u64x4::new(
1520             600257696476418,
1521             18449221564824,
1522             1422209458591138,
1523             239571584769716,
1524         ),
1525         u64x4::new(
1526             2056372917056980,
1527             1155290566623531,
1528             1252473955568148,
1529             1276690716882081,
1530         ),
1531         u64x4::new(
1532             246974369025311,
1533             658117221519903,
1534             2000380937898441,
1535             1351183273924850,
1536         ),
1537         u64x4::new(
1538             1803747363753112,
1539             1736801515030186,
1540             2025633577199091,
1541             603378480769167,
1542         ),
1543         u64x4::new(
1544             57348749438551,
1545             1893551220299655,
1546             657926732731806,
1547             1522499384853705,
1548         ),
1549     ])),
1550     CachedPoint(F51x4Reduced([
1551         u64x4::new(
1552             591809128842736,
1553             284860517232591,
1554             27436696863545,
1555             886306697195798,
1556         ),
1557         u64x4::new(
1558             2113192175751749,
1559             1405882509906423,
1560             561316282804847,
1561             835573846576266,
1562         ),
1563         u64x4::new(
1564             94407289485409,
1565             1781534171669004,
1566             2098782516531528,
1567             598529921520053,
1568         ),
1569         u64x4::new(
1570             1860137004504786,
1571             2197323407480349,
1572             1516772733981532,
1573             961740253777086,
1574         ),
1575         u64x4::new(
1576             1484139612868217,
1577             1593557644636881,
1578             838834937143441,
1579             36382198263380,
1580         ),
1581     ])),
1582     CachedPoint(F51x4Reduced([
1583         u64x4::new(
1584             1165898865828562,
1585             1153420815042389,
1586             1068625028915785,
1587             1945927229911090,
1588         ),
1589         u64x4::new(
1590             843454394017146,
1591             571029655293754,
1592             386282254545998,
1593             1804608237584150,
1594         ),
1595         u64x4::new(
1596             370552451091100,
1597             1279105656351124,
1598             1864742949668631,
1599             2093071521726981,
1600         ),
1601         u64x4::new(
1602             1872542389052198,
1603             1679083953574330,
1604             349872262454465,
1605             1470311090717925,
1606         ),
1607         u64x4::new(
1608             685345654160323,
1609             319718985807814,
1610             1359932285384164,
1611             1410900103316331,
1612         ),
1613     ])),
1614     CachedPoint(F51x4Reduced([
1615         u64x4::new(
1616             2083666668832889,
1617             314624387816655,
1618             1496694646480345,
1619             1946728950459189,
1620         ),
1621         u64x4::new(
1622             1579153761571203,
1623             508771185291380,
1624             1002249659402007,
1625             551517831173801,
1626         ),
1627         u64x4::new(
1628             2132371471626150,
1629             1988122278556533,
1630             1552195130653890,
1631             1327637750292755,
1632         ),
1633         u64x4::new(
1634             118937099181527,
1635             382610380973142,
1636             634951529106471,
1637             382740054041699,
1638         ),
1639         u64x4::new(
1640             801287519643470,
1641             87822941589258,
1642             1908825350108451,
1643             1404208826499115,
1644         ),
1645     ])),
1646     CachedPoint(F51x4Reduced([
1647         u64x4::new(
1648             330347226380261,
1649             672119116965146,
1650             1761510370768005,
1651             1959200302484704,
1652         ),
1653         u64x4::new(
1654             1631876583009250,
1655             1684917718484264,
1656             1027256947805920,
1657             2174612545251129,
1658         ),
1659         u64x4::new(
1660             636668855699872,
1661             625187713984839,
1662             265886954766790,
1663             167898557908504,
1664         ),
1665         u64x4::new(
1666             1210974548180860,
1667             2051308710365526,
1668             907620584086428,
1669             1081788677970850,
1670         ),
1671         u64x4::new(
1672             621792955460854,
1673             1450945504745382,
1674             1666728650687828,
1675             977937146451674,
1676         ),
1677     ])),
1678     CachedPoint(F51x4Reduced([
1679         u64x4::new(
1680             24725936182267,
1681             2226765032752574,
1682             2036560083102883,
1683             2002351185719584,
1684         ),
1685         u64x4::new(
1686             1620080779405308,
1687             1493220053370419,
1688             2245691691038916,
1689             1152182628629603,
1690         ),
1691         u64x4::new(
1692             317928527147500,
1693             1855194218440212,
1694             979380281964169,
1695             861442286685289,
1696         ),
1697         u64x4::new(
1698             393308472784625,
1699             486143087279967,
1700             1234071346236405,
1701             777748237119399,
1702         ),
1703         u64x4::new(
1704             43850412814718,
1705             1497656407486446,
1706             744128331046695,
1707             1618035787321792,
1708         ),
1709     ])),
1710     CachedPoint(F51x4Reduced([
1711         u64x4::new(
1712             1670169946550211,
1713             1230951698726438,
1714             806586940221293,
1715             23159779184607,
1716         ),
1717         u64x4::new(
1718             634011340979302,
1719             764182085034744,
1720             731065727766955,
1721             1737985776442180,
1722         ),
1723         u64x4::new(
1724             240492712141842,
1725             73976435954441,
1726             162810587166835,
1727             697230894340912,
1728         ),
1729         u64x4::new(
1730             1299745598348388,
1731             1359436039694544,
1732             1856609816731554,
1733             25228008461513,
1734         ),
1735         u64x4::new(
1736             2180690501932381,
1737             2161211192848458,
1738             87069466793408,
1739             2003456332883860,
1740         ),
1741     ])),
1742     CachedPoint(F51x4Reduced([
1743         u64x4::new(
1744             1106932458043379,
1745             1675181364231371,
1746             1681785724775243,
1747             131824742557210,
1748         ),
1749         u64x4::new(
1750             1671649414647169,
1751             1827849994880670,
1752             1097958057111899,
1753             701956891169434,
1754         ),
1755         u64x4::new(
1756             2095539283710881,
1757             591029812888096,
1758             1699571518315654,
1759             1297589045812566,
1760         ),
1761         u64x4::new(
1762             1345612272298537,
1763             2166754730876055,
1764             2047982622154948,
1765             1785222806258129,
1766         ),
1767         u64x4::new(
1768             2181915268829890,
1769             1895697064378670,
1770             1288412327355885,
1771             1561075738281368,
1772         ),
1773     ])),
1774     CachedPoint(F51x4Reduced([
1775         u64x4::new(
1776             741330264098392,
1777             357073519729966,
1778             1603572339180975,
1779             433572083688575,
1780         ),
1781         u64x4::new(
1782             699685108971208,
1783             1719650727634959,
1784             1941668009419214,
1785             870374958347891,
1786         ),
1787         u64x4::new(
1788             385971389331537,
1789             11655507719711,
1790             94814615497633,
1791             515572102810609,
1792         ),
1793         u64x4::new(
1794             1396688200590426,
1795             1518748475144123,
1796             162386454324368,
1797             2083303971579002,
1798         ),
1799         u64x4::new(
1800             1511688632419263,
1801             251584258592336,
1802             545345887993880,
1803             1229840230314160,
1804         ),
1805     ])),
1806     CachedPoint(F51x4Reduced([
1807         u64x4::new(
1808             1298668855706029,
1809             2017860934939344,
1810             2224150456036391,
1811             1925926576297971,
1812         ),
1813         u64x4::new(
1814             259522963883544,
1815             1312469129541229,
1816             1647530465049600,
1817             1113737129047154,
1818         ),
1819         u64x4::new(
1820             733193298663145,
1821             2115712816303403,
1822             897628702762311,
1823             116440277571901,
1824         ),
1825         u64x4::new(
1826             1998719395229750,
1827             1662774553684237,
1828             194395608126452,
1829             98796702872301,
1830         ),
1831         u64x4::new(
1832             2226158244229144,
1833             91961728239158,
1834             526869903032152,
1835             849263805316773,
1836         ),
1837     ])),
1838     CachedPoint(F51x4Reduced([
1839         u64x4::new(
1840             472779569333556,
1841             854477760843410,
1842             2070906720349401,
1843             734613359834689,
1844         ),
1845         u64x4::new(
1846             1771897100487404,
1847             1604024196006064,
1848             319699348925383,
1849             437152129592623,
1850         ),
1851         u64x4::new(
1852             627618365135361,
1853             1768642666037955,
1854             588564169143939,
1855             35295037750744,
1856         ),
1857         u64x4::new(
1858             220241884231278,
1859             319104161410840,
1860             1048165719448798,
1861             1583931089774347,
1862         ),
1863         u64x4::new(
1864             166479451884333,
1865             1623611819962804,
1866             59990366193679,
1867             900727256046987,
1868         ),
1869     ])),
1870     CachedPoint(F51x4Reduced([
1871         u64x4::new(
1872             1944687327687331,
1873             1328410791053991,
1874             2083980670913902,
1875             609396833380574,
1876         ),
1877         u64x4::new(
1878             1907563845734496,
1879             1385619047697883,
1880             869817384774457,
1881             106642388505109,
1882         ),
1883         u64x4::new(
1884             1006516581737154,
1885             1561918369633937,
1886             1921172883211450,
1887             2216650451558824,
1888         ),
1889         u64x4::new(
1890             1780506017391778,
1891             233064930371847,
1892             1332962603425752,
1893             1380075261612354,
1894         ),
1895         u64x4::new(
1896             1907624789747741,
1897             1310065402098523,
1898             1838275780706825,
1899             884225500782782,
1900         ),
1901     ])),
1902     CachedPoint(F51x4Reduced([
1903         u64x4::new(
1904             198729830692545,
1905             100156148743413,
1906             2140568641558859,
1907             2220606475942394,
1908         ),
1909         u64x4::new(
1910             1108788217903741,
1911             1706330932366163,
1912             2050449866410661,
1913             684907598542847,
1914         ),
1915         u64x4::new(
1916             1101958322366646,
1917             659427843062405,
1918             253899933868173,
1919             896574852821269,
1920         ),
1921         u64x4::new(
1922             1157052140740658,
1923             440541103447032,
1924             2173354981480949,
1925             604768603561932,
1926         ),
1927         u64x4::new(
1928             961238337866054,
1929             830849154351308,
1930             1643852412409441,
1931             1436749321770368,
1932         ),
1933     ])),
1934     CachedPoint(F51x4Reduced([
1935         u64x4::new(
1936             784870637473285,
1937             1180234052037572,
1938             2086951602998715,
1939             419328169540373,
1940         ),
1941         u64x4::new(
1942             1966862397394559,
1943             788036164772123,
1944             2024355635709481,
1945             1471696676696146,
1946         ),
1947         u64x4::new(
1948             1468884300957205,
1949             1408016588131185,
1950             2229595828577885,
1951             240413942963547,
1952         ),
1953         u64x4::new(
1954             1481791691942441,
1955             970648959691160,
1956             1635500996148197,
1957             2236917233261585,
1958         ),
1959         u64x4::new(
1960             31660820731028,
1961             801794768903647,
1962             1069092619607344,
1963             282652554845923,
1964         ),
1965     ])),
1966     CachedPoint(F51x4Reduced([
1967         u64x4::new(
1968             911659428682786,
1969             762502588057038,
1970             1311399152500807,
1971             1966922911783311,
1972         ),
1973         u64x4::new(
1974             1229849228728540,
1975             258161307933217,
1976             2140796867375541,
1977             1569345075547911,
1978         ),
1979         u64x4::new(
1980             1487354676143742,
1981             1818317546165791,
1982             811033554173350,
1983             1768788663337616,
1984         ),
1985         u64x4::new(
1986             450017165913234,
1987             962535873747168,
1988             2099104262993585,
1989             503030952485785,
1990         ),
1991         u64x4::new(
1992             1259958681304518,
1993             479589250923541,
1994             1503904042161640,
1995             706283657294305,
1996         ),
1997     ])),
1998     CachedPoint(F51x4Reduced([
1999         u64x4::new(
2000             794562643024291,
2001             198670993088241,
2002             1678984629358943,
2003             273399517554618,
2004         ),
2005         u64x4::new(
2006             188458991574433,
2007             1389872130156447,
2008             1461868931574746,
2009             795140878721432,
2010         ),
2011         u64x4::new(
2012             624046647169653,
2013             630363741191019,
2014             911018499983500,
2015             1410140563046579,
2016         ),
2017         u64x4::new(
2018             1675056174405076,
2019             632544713589250,
2020             795454163559811,
2021             1535271563341780,
2022         ),
2023         u64x4::new(
2024             25504547444781,
2025             812510098987855,
2026             51290042016232,
2027             1992260991700127,
2028         ),
2029     ])),
2030     CachedPoint(F51x4Reduced([
2031         u64x4::new(
2032             269968325452358,
2033             470932785179706,
2034             1684444304834150,
2035             1027482126748243,
2036         ),
2037         u64x4::new(
2038             457941065342419,
2039             2117377568137882,
2040             1209423706730905,
2041             2192403099717071,
2042         ),
2043         u64x4::new(
2044             1899046404863678,
2045             1359500336071762,
2046             1492389156724726,
2047             1455627081827750,
2048         ),
2049         u64x4::new(
2050             2016101061876546,
2051             1967000012916571,
2052             582539481696050,
2053             1197538178790094,
2054         ),
2055         u64x4::new(
2056             639684852217504,
2057             1799941252757449,
2058             1470016556327743,
2059             846111828965901,
2060         ),
2061     ])),
2062 ]);
2063