Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
isogeny_walks.h
Go to the documentation of this file.
1//
2// Isogeny walks via radical computations
3//
4
5#ifndef SSEC_ISOGENY_WALKS_H
6#define SSEC_ISOGENY_WALKS_H
7
8#if defined AVX2
9#include "../common/fp/avx2/fp-avx2.h"
10#elif defined GMP
11#include "../common/fp/gmp/fp-gmp.h"
12#elif defined KARATSUBA
13#include "../common/fp/karatsuba/fp-karatsuba.h"
14#else
15 #include "../common/fp/mulx/fp.h"
16#endif
17#include "../common/mont.h"
18#include "../common/primes.h"
19
20
21#ifdef P2047m1l226
22static const fp CUBE_ROOT_EXPONENT_213 = {
230xFFFFFFFFFFFFFFFF, 0x87779EEE93BC7BA1, 0x213C6602AF9EF1A0,
240x6A56E8FD46D70A38, 0xAB213A5B93F1D440, 0x37CD33ED871147E5, 0x1D822425FEF14E21,
250x2F2AC40002044BEC, 0x29CCF47F6DF2198A, 0xE5A1FE21B734CF6E, 0x18C4125AC8667060,
260x91C0851B4368410A, 0xEA9756C5E80606E9, 0x617955512CDB9A15, 0x38F3AC9521916695,
270x1F5E61186736A8A4, 0x93545D3E871FA163, 0x453B5FADAC0A24D5, 0xAE939681BFBF17FC,
280x678629BA3600F7D1, 0x8FB97FB174A1ABD5, 0xC0E77DC404EE1C63, 0x29628E157BAD019A,
290x8125CB1D85152E9D, 0x1C893F6E31689FF6, 0x3E5BCE0B79749A37, 0x3DB7950772C36826,
300xCCCF3352DE900AD6, 0xA9874702325F776, 0x5B1C4FDE8993318C, 0x1E8BCA80234517A5,
310x323B01F1989C3A9A
32};
33static const fp ONE_HALF = {
340x0000000000000001, 0x34CC919A2265468D, 0xCE2566FBF891958F, 0x607DA28415BD70AB,
350x7F4E2876A215419F, 0x2C4C321BB5661427, 0xD3BCC9C701960ACE, 0xB93FD9FFFCF98E1D,
360xC14C9140DB14D9B0, 0xA78D02CD6D30C8DA, 0xDAD9E477D366576E, 0xA55F38571AE39E70,
370x201CFDD723F6F5A1, 0xEDCA00063CB698DF, 0xAA927D204DA5E61F, 0x50F26E5B652E0309,
380xA301742235508DEB, 0x9826F07B7DF0C8BF, 0x7A229E3D60615C05, 0xE4B6C168AEFE8C45,
390xA869C075D10D7E3F, 0xDEA4C359F89AD56A, 0x41EC2ADFC67C7D97, 0x3E474F53B8603A14,
400x553220DAB5E3100E, 0xA2764AEEC9D118AD, 0xA36CA074D3DAE3C6, 0xCCC93303B227EFBE,
410xF01B5157CB470CCD, 0xF755883231A335AD, 0xD22E503FCB185C87, 0x34A77D159B15A818
42};
43
44static const fp ONE_THIRD = {
450x5555555555555556, 0xCDDDB666C198D9B3, 0x3418EF52A5B663B4, 0xEAFE6C580E7E4B1D,
460xAA341AF9C1638114, 0x1D882167CE440D6F, 0x37D3312F56640734, 0x262A915553510969,
470x2B8860D5E7633BCB, 0x6FB357339E2085E7, 0x3C9142FA8CEEE4F4, 0xC394D03A11ED144B,
480x6ABDFE8F6D4F4E6B, 0xF3DC00042879BB3F, 0x1C61A8C033C3EEBF, 0x35F6F43CEE1EACB1,
490xC200F816CE35B3F2, 0x1019F5A7A94B307F, 0xA6C1BED395963D59, 0xEDCF2B9B1F545D83,
500xC59BD5A3E0B3A97F, 0x946DD791506738F1, 0x2BF2C73FD9A853BA, 0xD42F8A37D04026B8,
510x38CC15E723ECB55E, 0x16F98749DBE0BB1E, 0x179DC04DE291ED2F, 0x8886220276C54A7F,
520x4ABCE0E5322F5DDE, 0xFA390576CBC223C9, 0x36C98AD532103DAF, 0x231A5363BCB91ABB
53};
54
55static const fp ONE_NINTH = {
560x1C71C71C71C71C72, 0x99F4922240884891, 0x66B2FA70E1E77691, 0x4E54CEC804D4C3B4,
570x8E115E534076805C, 0x5F2D6077EF6C047A, 0x129BBB0FC776AD11, 0x0CB8DB1C711B0323,
580x0E82CAF1F7CBBE99, 0xCFE672668A0AD74D, 0xBEDB1653844FA1A6, 0x9686F0135B4F06C3,
590x78E9FF85246FC4CE, 0xFBF4000162D33E6A, 0x0975E2EABBEBFA3F, 0x67525169A4B4E43B,
600x40AAFD5CEF673BFB, 0x5AB351E28DC3BAD5, 0x8CEB3F9BDC8769C8, 0xA49A63DE5FC6C9D6,
610xEC894736A03BE32A, 0x3179F285C577BDA5, 0xB950ED15488D713E, 0x9C0FD8BD456AB792,
620xBD995CA2614EE71F, 0x07A8826DF3F593B4, 0x07DF4019F630A465, 0x2D820B56279718D5,
630x6E3EF5A1BB651F4A, 0x536857279940B698, 0x6798839C660569E5, 0x0BB371213EE85E3E
64};
65
66static const fp ONE_BY_27 = {
670x097B425ED097B426, 0xDDFC30B61582C2DB, 0x223BA8D04B4D2785, 0xC4C6EF98019C413C,
680xDA05CA1BC027801E, 0xCA64757D4FCEAC28, 0xB0DE93AFED278F05, 0xAEE849097B09010B,
690xAF80EE50A7EE94DD, 0x9AA226222E039D19, 0xEA4907712C1A8B37, 0x322CFAB11E6FACEB,
700x284DFFD70C25419A, 0xFEA6AAAB20F114CE, 0x587CA0F8E94EA8BF, 0x77C61B2336E6F6BE,
710x158E54744FCD13FE, 0x1E3BC5F62F413E47, 0x844E6A8949827898, 0x8C33769F75424347,
720xF98317BCE013F663, 0xBB28A62C9727E9E1, 0x3DC5A45C6D847B14, 0x3405483F17239286,
730xE9DDC98B75C4F7B5, 0x028D80CF5151DBE6, 0x57F5155DFCBAE177, 0x6480AE720D325D9C,
740xCF6A51E093CC5FC3, 0xC6781D0D33159232, 0x22882BDECCAC78A1, 0x03E67B0B14F81F6A
75};
76#endif
77
78#ifdef P2047m4l205
79static const fp CUBE_ROOT_EXPONENT_213 = {
80 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
81 0xFFFFFFFFFFFFFFFF, 0xC638EB5843CFFFFF, 0x3597DCAD6317016E, 0x642741FEB670775F,
82 0xC9F8CEADD4B2625A, 0x1ABF6F8F673935D2, 0x9D515209928E23CD, 0xA8305AE5D28241C3,
83 0x721C932E426A5077, 0xC068596C696E0298, 0xE62279ADF94431FA, 0x8752C725EAD714A8,
84 0x68D8BB85C46AA869, 0xD6AD08FED8E8FFED, 0x22C004CC0F7D6FB2, 0xF9C7670629F564CA,
85 0x1F5395C34A664FF2, 0xC3A7E869AADDC0C2, 0x3F1A93EEF39867D8, 0xF0C2DA214B09FA03,
86 0x367241D4CD7FCD60, 0xDBC00C2B71949FD9, 0x17AE7DCC4231E239, 0x3E78ADFBA5A3170B,
87 0x2FBD32BC946988A0, 0x86337E3FC41663FA, 0x7F710347013BA61C, 0xAD27AB62A8E8ADFD,
88 0x41DC5EDB807F2382
89};
90static const fp ONE_HALF = {
91 0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
92 0xD6AA9EFB9A480000, 0x2F9C34FBEB5D7DD9, 0x69C51D01EE574CF1, 0xD10AC9FB40F46C78,
93 0x57E0D8A8E52A2F43, 0x940604F1A42ACA4C, 0x83B777A7443C9D5A, 0x54D5233A9C60874C,
94 0xDF6379DD61DAFC1B, 0xA6CC497B0A19B507, 0xB503D5471FBD6102, 0xE2BAE6B759600361,
95 0xBDFC7281BAA2801B, 0xCBDFF8CDE8C3D873, 0x8954E576C10FE8D0, 0xD1029F5B10668813,
96 0xDA8423617FB35EDC, 0x21582219929B643A, 0x96DBB8CE0F7108FB, 0x2E549D40CBC04BEE,
97 0x365FEDBED5A1103A, 0x5C7A434D9CB52CA9, 0xA24AFB06878B5D6F, 0xB86433E52161B30F,
98 0x36B2C2A059DE6A08, 0xC0D67B157E2686D5, 0xFC447EEC02A2FB03, 0x1D3571B6BF414ABB
99};
100
101static const fp ONE_THIRD = {
102 0x5555555555555556, 0x5555555555555555, 0x5555555555555555, 0x5555555555555555,
103 0x8F1C69FD11855555, 0x1FBD78A7F23E53E6, 0xF12E13569EE4DDF6, 0x8B5C86A780A2F2FA,
104 0x3A95E5C5EE1C1F82, 0xB804034BC2C73188, 0xAD24FA6F82D31391, 0xE338C22712EB04DD,
105 0x94ECFBE8EBE752BC, 0x6F32DBA75C11235A, 0xCE028E2F6A7E40AC, 0xEC7C99CF90EAACEB,
106 0x7EA84C567C6C5567, 0x3295508945D7E5A2, 0x5B8DEE4F2B5FF08B, 0x3601BF920AEF0562,
107 0x91AD6CEBAA779493, 0x163AC16661BCED7C, 0x64927B340A4B5B52, 0x1EE3138087D587F4,
108 0x79954929E3C0B57C, 0x3DA6D7891323731B, 0x16DCA759AFB23E4A, 0x25982298C0EBCCB5,
109 0xCF21D715913EF15B, 0xD5E4520E5419AF38, 0xA82DA9F2AC6CA757, 0x1378F679D4D631D2
110};
111
112static const fp ONE_NINTH = {
113 0x71C71C71C71C71C7, 0xC71C71C71C71C71C, 0x1C71C71C71C71C71, 0x71C71C71C71C71C7,
114 0xE825EE55D269C71C, 0x500B168EACF59CAE, 0x2D22FCC6E58485AC, 0x3E1B3EE4153A2CD6,
115 0xF63C59B45850A56A, 0x0BFF54C8B4DECD13, 0xB879D642BF877CBD, 0xDA2134F97CD8D485,
116 0x91D880AE83597235, 0x42CCDB641B527A1B, 0x5DAA3DA2C3959FE3, 0xADEB3BB2BD2E3883,
117 0x4039489C40989C6E, 0x223C7293C9B159BA, 0x461302F2CE1AAD3E, 0xCC550ABCFE2D7F1A,
118 0x3D0DC32E0E41673C, 0xFC4B8A6EEFB5D86B, 0x99E79621FE48C61C, 0xA584D2153EB1BEAC,
119 0xC111C923AF5FE1C0, 0xF5B986BE7CCF6CD0, 0x7C308EC662B7A048, 0xCF114F91352E088C,
120 0xDD7A5C2712758270, 0x07049CFD9CA662CB, 0x8EA30E578DEDE41C, 0x276BD6EBB1DC4D07
121};
122
123static const fp ONE_BY_27 = {
124 0x25ED097B425ED097, 0xED097B425ED097B4, 0x097B425ED097B425, 0x7B425ED097B425ED,
125 0x68F03ACA349DED09, 0xA59B8EDCF2138AFE, 0x7332EB9658474E98, 0x3401E3A48670714C,
126 0xC228E2CB84A96CF6, 0xF6A66E4C798312D3, 0x3B03A25167AF6B57, 0xBAD24F816C07ECA4,
127 0xF105D9A695367DFF, 0xA7116D7A025FB003, 0xFBE0DBB1815E49F4, 0x4D7C7A16AE24BB3F,
128 0x96C02132EE713412, 0xD8D42AFD52B88D9B, 0x112312AC6EA8F3DE, 0x636FEEACF4757A51,
129 0x2D57297904F38DD6, 0x9333C213EE2A5AA7, 0x24100C2C9FCCE6B7, 0x184932868D106245,
130 0x1C1B4F3756B495C4, 0x6997000BC121B12A, 0xBD33883DC68AF723, 0x1F6DA297A6238B79,
131 0xD006F24CCA3D8F75, 0xD71D379B8AC871B5, 0x875E057FD837FA06, 0x4F00512A111DE7DA
132};
133#endif
134
135#ifdef P2047m6l194
136static const fp CUBE_ROOT_EXPONENT_213 = {
1370xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
1380xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xBD0B074CFE00024F,
1390x4BAC2164C074ACA4, 0x3FBC0A160D91873, 0x5EAC49E6A24559BE, 0xBA25874CAB37A12,
1400x3295173C709A30F9, 0x7F4D07FB4DDD8D29, 0x38982EB1A7817B27, 0x5CE0D94B20B1F6D,
1410xEDFA5D782487A839, 0x60803CFB001E158B, 0xACA120F6343CDFCD, 0xF93EEFDF2694D458,
1420x7BA144949664B562, 0x245E0C6921797563, 0xE86D13238ECE8A77, 0xD7767A664F04BEC8,
1430xB947CE2D75033E4C, 0x9A19076B3B42C04E, 0xF7B08D4C3167E010, 0x7EED903D4D70BA72,
1440x7A1C12DCAB677198, 0xD38252B330EB8530, 0x3E1B7F2B159AC4DE, 0xAB05F4E16A7BD263,
1450x2DAEE4AF4B890CBA
146};
147static const fp ONE_HALF = {
1480x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
1490x0000000000000000, 0x0000000000000000, 0xE46F750C82FFFC88, 0x0E7DCDE8DF50FD08,
1500xFA065F0DEEBA5B53, 0x71FD91260C97F962, 0x6E8C7B50CFF2C8E4, 0x34205D255718B68A,
1510xC10C74070B33AC42, 0x2B1BB9F584BDC744, 0x774AEBA0F4EF50DC, 0x1B0873CBC93483AA,
1520xEF3FA4877FD2DFAE, 0xFD0E4E8EB1A4B04B, 0x8A2198314620C17A, 0xC68E19211E68EFEB,
1530x4972ED624DC9CFEA, 0xA35C634AA9CA304D, 0xBCCE48668978E1D2, 0xEA144ABBD07B228C,
1540x18DA74DF271BDF89, 0x8C772C0DB5E42FE7, 0x419BA7A40BD6E853, 0x48D5E3B4FEE4D59B,
1550xC2BC83F3369EB837, 0x22D6C13F5F97D8B1, 0xFF7710ADE046446B, 0x3B79A8F90EB26CE7
156};
157
158static const fp ONE_THIRD = {
1590x5555555555555556, 0x5555555555555555, 0x5555555555555555, 0x5555555555555555,
1600x5555555555555555, 0x5555555555555555, 0x984A4E0857555305, 0x09A933F094E0A8B0,
1610x515994B3F47C3CE2, 0xF6A90B6EB30FFB97, 0x49B2FCE08AA1DB42, 0x22C03E18E4BB245C,
1620xD6084D5A0777C82C, 0x1CBD26A3ADD3DA2D, 0x4F8747C0A34A35E8, 0x675AF7DD30CDAD1C,
1630xF4D5185A55373FC9, 0xA8B4345F21187587, 0x5C1665762EC080FC, 0xD9B410C0BEF09FF2,
1640x30F748EC33DBDFF1, 0x6CE84231C686CADE, 0x7DDEDAEF0650968C, 0x9C0D8727E0521708,
1650xBB3C4DEA1A129506, 0x5DA4C80923ED7544, 0xD667C51807E49AE2, 0xDB394278A9EDE3BC,
1660x81D302A22469D024, 0x1739D62A3FBA9076, 0xAA4F6073EAD982F2, 0x27A670A609CC489A
167};
168
169static const fp ONE_NINTH = {
1700x71C71C71C71C71C7, 0xC71C71C71C71C71C, 0x1C71C71C71C71C71, 0x71C71C71C71C71C7,
1710xC71C71C71C71C71C, 0x1C71C71C71C71C71, 0xE69E4853F171C77F, 0xFE63CCAD3C853937,
1720xC7C667375740A084, 0xD6E3D36D8CD2AB66, 0xF3B780853E3A5B74, 0xFA354AFBD9E0CF45,
1730x5C53F31BA96C094D, 0xFB35CEE4B85CB0F8, 0xF2BEC95FE4C8F703, 0xC41B815B22886325,
1740xAC87269B9C76CAB3, 0x39374C9ACFD141BE, 0x45FC446C4D8A952B, 0x0661FD3535829002,
1750xF7D6C92DF75B5AAD, 0x432E9FA25EE988DA, 0xEB05862D7EF29193, 0x3B5314240547A6D3,
1760xE0CB4858FBA791D4, 0x45B9DEA924ADC1C9, 0xDC4409D1540490DA, 0x30CBCA41390304B5,
1770xEA5CD4E4F9EE5D4F, 0xA6CBB1A3A00B9296, 0xE39D6FECAE3114D7, 0x240EED39A9089E90
178};
179
180static const fp ONE_BY_27 = {
1810xD097B425ED097B42, 0x97B425ED097B425E, 0xB425ED097B425ED0, 0x25ED097B425ED097,
1820xED097B425ED097B4, 0x097B425ED097B425, 0x00BA466D24D098FD, 0x4FF754EC1F116965,
1830xEF4002B8782CC1BB, 0xCC4CC0C2801390AB, 0x2C63AC66CF6D30DA, 0xECB1A49CD642B2E9,
1840x8917D506DF681F03, 0x455E06FA668A4DE6, 0x7E7BF494FA9DE20D, 0x385BAF2FC8714A7E,
1850xE9C280B15EE14E57, 0xBEB854AEB4B985D0, 0x93F38EBE57CDF13A, 0xBFF14C06B25DE007,
1860xE4CBF3EE8DDB2E40, 0xDFF0BEC7E70A72D9, 0x64BD1497A7288FEA, 0x1B14EDCD66EED6C2,
1870x42A59BD346D93B6E, 0x3DC0E633CF9885F6, 0x88E2CB646D648D82, 0xF7FCA22EBE0A0FB3,
1880x628AC5A5EBC53707, 0x8151A576C026934C, 0xF6B77514EF4E4579, 0x22DC6C1588C765E2
189};
190#endif
191
192void isogeny_walks_get_points_3_fp(fp *output, const proj input_A);
193void isogeny_walks_to_montgomery_model_3_fp(fp *output_A, const fp *input_t);
194void isogeny_walks_3_fp(fp output_A, const proj input_A, size_t input_length, uint8_t direction);
195
196#endif // SSEC_ISOGENY_WALKS_H
void isogeny_walks_get_points_3_fp(fp_t *output, const fp_t *input_A)
void isogeny_walks_3_fp(fp_t output_A, const fp_t input_A, int input_length)
void isogeny_walks_to_montgomery_model_3_fp(fp_t *output_A, const fp_t *input_t)
uint64_t fp[NUMBER_OF_WORDS]
Definition fp-gmp.h:22
Definition proj.h:18