16 S =
".global " + Var +
"\n" + Var +
":\n"
20 for i
in range(1,pwords+1):
21 if (((i - 1)%4) == 0):
27 S = S +
"0x{:X}".format(PWord[i-1]) +
","
30 S = S +
"0x{:X}".format(PWord[i-1]) +
" \n"
42 S =
".intel_syntax noprefix\n\n"
43 S = S +
".section .rodata\n\n"
44 S = S +
".set pbits," + str(pbits) +
"\n"
45 S = S +
".set pbytes," + str(pbytes) +
"\n"
46 S = S +
".set plimbs," + str(plimbs) +
"\n\n"
53 S =
".intel_syntax noprefix\n\n"
54 S = S +
".section .rodata\n\n"
55 S = S +
".global uintbig_1\nuintbig_1:\n"
56 S = S +
" .quad 1, 0, 0, 0\n"
59 for i
in range(1, N+1):
60 S = S +
" .quad 0, 0, 0, 0\n"
69 S = S +
".section .text\n\n"
71 S = S +
".global uintbig_add\nuintbig_add:\n mov rax, [rsi + 0]\n add rax, [rdx + 0]\n mov [rdi + 0], rax\n .set k, 1\n"
73 S = S +
" .rept " + str(plimbs-1) +
"\n"
75 S = S +
"mov rax, [rsi + 8*k]\n adc rax, [rdx + 8*k]\n mov [rdi + 8*k], rax\n .set k, k+1\n .endr\n setc al\n movzx rax, al\n ret\n\n"
77 S = S +
".global uintbig_sub\nuintbig_sub:\n mov rax, [rsi + 0]\n sub rax, [rdx + 0]\n mov [rdi + 0], rax\n .set k, 1\n"
79 S = S +
" .rept " + str(plimbs-1) +
"\n"
81 S = S +
" mov rax, [rsi + 8*k]\n sbb rax, [rdx + 8*k]\n mov [rdi + 8*k], rax\n .set k, k+1\n .endr\n setc al\n movzx rax, al\n ret"
93 S =
".section .text\n\n.p2align 4,,15\n\n"
95 S = S +
".global fp_copy\nfp_copy:\n cld\n mov rcx, plimbs\n rep movsq\n ret\n\n"
96 S = S +
".global fp_cswap\nfp_cswap:\n movzx rax, dl\n neg rax\n .set k, 0\n .rept plimbs\n mov rcx, [rdi + 8*k]\n"
97 S = S +
" mov rdx, [rsi + 8*k]\n mov r8, rcx\n xor r8, rdx\n and r8, rax\n\n xor rcx, r8\n xor rdx, r8\n\n"
98 S = S +
" mov [rdi + 8*k], rcx\n mov [rsi + 8*k], rdx\n\n .set k, k+1\n .endr\n ret\n\n"
99 S = S +
".global fp_cmov\n"
101 S = S +
" movzx rax, dl\n"
103 S = S +
" .set k, 0\n"
104 S = S +
" .rept plimbs\n"
105 S = S +
" mov rcx, [rdi + 8*k]\n"
106 S = S +
" mov rdx, [rsi + 8*k]\n"
107 S = S +
" xor rdx, rcx\n"
108 S = S +
" and rdx, rax\n"
109 S = S +
" xor rcx, rdx\n"
110 S = S +
" mov [rdi + 8*k], rcx\n"
111 S = S +
" .set k, k+1\n"
120 Reg_Ar = [
"rdi",
"rsi",
"rdx",
"rcx",
"r8",
"r9",
"r10",
"r11"]
122 S =
".reduce_once:\n push rbp\n mov rbp, rdi\n\n mov rdi, [rbp + 0]\n sub rdi, [rip + p + 0]\n"
126 for i
in range(8,N+1,8):
127 S = S +
" mov " + Reg_Ar[(int(i/8) % 8)] +
", [rbp + " + str(i) +
"]\n sbb " + Reg_Ar[(int(i/8) % 8)] +
", [rip + p + " + str(i) +
"]\n"
128 if ((int((i+8)/8)%8) == 0)
and (i != 0):
131 S = S +
"\n setnc al\n movzx rax, al\n neg rax\n\n"
132 S = S +
".macro cswap2, r, m\n xor \\r, \\m\n and \\r, rax\n xor \\m, \\r\n.endm\n\n\n"
134 n = -(int(pbytes/8) % 8) +8
136 for i
in range(1, n+1):
137 S = S +
" cswap2 " + Reg_Ar[i-1] +
", [rbp + " + str((pbytes-n*8)+(i-1)*8) +
"]\n"
142 for j
in range(1, M+1):
144 S = S +
"\n mov rdi, [rbp + 0]\n sub rdi, [rip + p + 0]\n"
145 for i
in range(8,N+1,8):
146 S = S +
" mov " + Reg_Ar[int(i/8) % 8] +
", [rbp + " + str(i) +
"]\n sbb " + Reg_Ar[int(i/8) % 8] +
", [rip + p + " + str(i) +
"]\n"
147 if ((int((i+8)/8)%8) == 0)
and (i != 0):
150 S = S +
" cswap2 " + Reg_Ar[i-1] +
", [rbp + " + str((N-64)+i*8) +
"]\n"
153 S = S +
" pop rbp\n ret\n\n"
161 S=
".global fp_add2\nfp_add2:\n mov rdx, rdi\n\n"
163 S = S +
".global fp_add\nfp_add:\n push rdi\n call uintbig_add\n pop rdi\n\n jmp .reduce_once\n\n"
164 S = S +
".global fp_sub2\nfp_sub2:\n mov rdx, rdi\n xchg rsi, rdx\n\n.global fp_sub\nfp_sub:\n push rdi\n call uintbig_sub\n pop rdi\n\n\n"
166 S = S +
" mov rcx, [rip + p + 0]\n and rcx, rax\n mov [rsp + 0],rcx\n .set k, 1\n .rept plimbs-1\n mov rcx, [rip + p + 8*k]\n and rcx, rax\n"
167 S = S +
" mov [rsp + 8*k], rcx\n .set k, k+1\n .endr\n\n"
168 S = S +
" mov rcx, [rsp + 0]\n add rcx, [rdi + 0]\n mov [rdi + 0], rcx\n .set k, 1\n .rept plimbs-1\n mov rcx, [rsp + 8*k]\n"
169 S = S +
" adc rcx, [rdi + 8*k]\n mov [rdi + 8*k], rcx\n .set k, k+1\n .endr\n\n add rsp, pbytes\n ret\n\n\n"
170 S = S +
"/* Montgomery arithmetic */\n\n.global fp_enc\nfp_enc:\n lea rdx, [rip + r_squared_mod_p]\n jmp fp_mul\n\n"
171 S = S +
".global fp_dec\nfp_dec:\n lea rdx, [rip + uintbig_1]\n jmp fp_mul\n\n\n"
179 Reg_Ar = [
"rbx",
"rcx"]
181 S =
".global fp_mul2\nfp_mul2:\n mov rdx, rdi\n.global fp_mul\nfp_mul:\n push rbp\n push rbx\n\n"
184 S = S +
" sub rsp, " + str(pbytes + 16) +
"\n mov [rsp+ " + str(pbytes+8) +
"],rdi\n mov rdi,rsi\n mov rsi,rdx\n\n\n"
185 S = S +
" xor rax,rax\n"
189 for i
in range(0,N+1,8):
190 S = S +
" mov [rsp+" + str(i) +
"],rax\n"
194 S = S +
"\n\n.macro MULSTEP, k, "
196 for i
in range(0, pwords):
198 R = R +
"I" + str(i) +
","
201 S = S +
"I" + str(pwords) +
"\n\n"
202 S = S +
" mov r11,[rsp+\\I0]\n mov rdx, [rsi + 0]\n mulx rcx, rdx, [rdi + 8*\\k]\n add rdx, r11\n mulx rcx, rdx, [rip + inv_min_p_mod_r]"
203 S = S +
"\n\n xor rax, rax /* clear flags */\n\n\n"
205 S = S +
" mulx rbx, rax, [rip + p + 0]\n adox r11, rax\n mov [rsp+\\I0], r11\n\n"
209 for i
in range(8,N+1,8):
210 S = S +
" mov r11,[rsp+\\I" + str(int(i/8)) +
"]\n mulx " + Reg_Ar[(int(i/8) % 2)] +
", rax, [rip + p + " + str(i) +
"]\n "
211 S = S +
" adcx r11, " + Reg_Ar[-(int(i/8) % 2) +1] +
"\n adox r11, rax\n mov [rsp+\\I" + str(int(i/8)) +
"],r11\n\n"
213 S = S +
"\n mov r11,[rsp+\\I" + str(pwords) +
"]\n mov rax, 0\n adcx r11, rcx\n adox r11, rax\n mov [rsp+\\I" + str(pwords) +
"],r11\n\n"
214 S = S +
" mov rdx, [rdi + 8*\\k]\n\n xor rax, rax /* clear flags */\n\n"
216 S = S +
" mov r11,[rsp+\\I0]\n mulx rbx, rax, [rsi + 0]\n adox r11, rax\n mov [rsp+\\I0],r11\n\n"
218 for i
in range(8,N+1,8):
219 S = S +
" mov r11,[rsp+\\I" + str(int(i/8)) +
"]\n mulx " + Reg_Ar[int(i/8) % 2] +
", rax, [rsi + " + str(i) +
"]\n"
220 S = S +
" adcx r11, " + Reg_Ar[-(int(i/8) % 2) +1] +
"\n adox r11, rax\n mov [rsp+\\I" + str(int(i/8)) +
"],r11\n\n"
222 S = S +
" mov r11,[rsp+\\I" + str(pwords) +
"]\n mov rax, 0\n adcx r11, rcx\n adox r11, rax\n mov [rsp+\\I" + str(pwords) +
"],r11\n\n.endm\n\n"
225 for i
in range(0, pwords):
226 T = T +
"MULSTEP " + str(i) +
","
227 for j
in range(8,pbytes+1,8):
228 T = T + str((j + i*8) % (pbytes + 8)) +
","
231 S = S + str((pbytes +8 + i*8) % (pbytes + 8)) +
"\n"
233 S = S +
"\n\n mov rdi,[rsp+" + str(pbytes+8) +
"]\n\n"
235 for i
in range(0,N+1,8):
236 S = S +
" mov r11,[rsp+" + str(i) +
"]\n mov [rdi+" + str(i) +
"],r11\n"
239 S = S +
" add rsp," + str(pbytes+16) +
"\n\n pop rbx\n pop rbp\n\n jmp .reduce_once\n\n\n"
241 S = S +
".global fp_sq1\nfp_sq1:\n mov rsi, rdi\n.global fp_sqr\nfp_sqr:\n mov rdx, rsi\n\n jmp fp_mul\n"
251 S =
".global fp_pow\nfp_pow:\n push rbx\n mov rbx, rsi\n push r12\n push r13\n push rdi\n sub rsp, pbytes\n\n"
252 S = S +
" mov rsi, rdi\n mov rdi, rsp\n call fp_copy\n\n mov rdi, [rsp + pbytes]\n lea rsi, [rip + fp_1]\n call fp_copy\n\n"
253 S = S +
".macro POWSTEP, k\n mov r13, [rbx + 8*\\k]\n xor r12, r12\n\n"
254 S = S +
" 0:\n test r13, 1\n jz 1f\n\n mov rdi, [rsp + pbytes]\n mov rsi, rsp\n call fp_mul2\n\n"
255 S = S +
" 1:\n mov rdi, rsp\n call fp_sq1\n\n shr r13\n\n inc r12\n test r12, 64\n jz 0b\n.endm\n\n"
257 for i
in range(0, pwords):
258 S = S +
" POWSTEP " + str(i) +
"\n"
260 S = S +
" add rsp, pbytes+8\n pop r13\n pop r12\n pop rbx\n ret\n\n\n"
267 S =
".global fp_inv\nfp_inv:\n lea rsi, [rip + p_minus_2]\n jmp fp_pow\n\n\n"
268 S = S +
".global fp_issquare\nfp_issquare:\n push rdi\n lea rsi, [rip + p_minus_1_halves]\n call fp_pow\n pop rdi\n\n"
269 S = S +
" xor rax, rax\n .set k, 0\n .rept plimbs\n mov rsi, [rdi + 8*k]\n xor rsi, [rip + fp_1 + 8*k]\n or rax, rsi\n"
270 S = S +
" .set k, k+1\n .endr\n test rax, rax\n setz al\n movzx rax, al\n ret\n\n\n"
272 S = S +
".global fp_random\nfp_random:\n\n push rdi\n mov rsi, pbytes\n call randombytes\n pop rdi\n"
273 S = S +
" mov rax, 1\n shl rax, (pbits % 64)\n dec rax\n and [rdi + pbytes-8], rax\n\n .set k, plimbs-1\n .rept plimbs\n"
274 S = S +
" mov rax, [rip + p + 8*k]\n cmp [rdi + 8*k], rax\n jge fp_random\n jl 0f\n .set k, k-1\n .endr\n 0:\n ret"
284 RR = IntegerModRing(R)
291 pinv = int(RR(-p).inverse_of_unit())
306 S =
".global fp_0\nfp_0:\n.zero pbytes\n\n"
327 pquartersWords =
WordExtractor((p-3)//4, pwords,
"p_minus_3_quarters")
338 pbits = math.ceil(math.log(p, 2.0))
339 pbytes = math.ceil(pbits/8)
341 pbytes = pbytes + 4 - (pbytes%4)
342 pwords = math.ceil(pbits/64)
371p_2047d221 = 0x5160D4543A2596D320C080B284C0FA5D3600AE4E29B85374858B238036139EA0B8B0C8B2850475382865FD4C9F7C3B5E531ED7D0FC022A13270300584EC78190FD09755A56CFEB1FC6961581CDFC56E824D0F31C4D4ECF04C5243CA0651820AF413023A7310203F74858FBECACA26B375BEBA9DE78CC420A069477B7FE595F83B148223C6841B3592C74AF79F39AE8F3D64F8B9FC946BB1C84A4541CBC2F363029B2C1E296158774A9646D2E186AD699B304FC7311F0DEC85E651756DDB4E3888D02333D591583AE5DB2F656E63A6179CDB059ED9BF90BAD614DCA5628C940C5004D99FB1CB03CE478F65726B12E42FA1C7C8FFFFFFFFFFFFFFFFFFFFFFFFFFF
372p_2047n221 = 0x459AEF6A877E5ADAA0902C6A81793F136D3E606CECECC229616377E3B9C4A5630F19ADD54D8C5523E1A3AED0A5CB129A69220DB334EFF4A66BFA495ACCBFA7A31B1097D145C0FB10A0427AD5EE55DA93D7B04D72732719ACF7C00FC0BCDC2ADD1DCC5DD91163C9547109B0A8A65EC1BDEB34774FB24FE7A88EEC915BE40A0402A3D8A48E8371EC94456DE1CB00A2F8C07FAF5AACAB12ED8E6C81F4CD3BFE4FB5C3A08FCD2434148F82FEEC069F4509398AEDB078EAD657ED2D3BB68D87A80459D590CF47C1CD12CFE0A33DE40AB61EC18AD9791E0024F0E7EF3E782F87E2823D2B205845C6ED21AEB7E8298551D41019334FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
375p_4095d221 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5DCA635299EB2760CEDC3F12450C814FFA2DAFE875F09E8431F9BA694168EEF6A817F89E440736245D3D5615D75C648E8F90A3A4C6D12637CCD73F0B737F1AC09AF7B08CC11A71C4828DD80E16A08A29B57FB1322C6CF36BFD7B3C80A74000006EC3E89EA92275375DDAFD803BAF91F015F8218A5656A5785B5D8AAD338C9A4B887C3C7F367CC427744A1769686187B788DE2A6779C85A68380A7D2B7CC3B5FD680BC2708E20D188C0C320B3BF35B180FB234C85A0B72C5CE482CABE61EA58A6E2DD0FF11C5961E04B98980F9F1AF33B32E3E95171509454DFC9D28084903267459D8A3E22C44CB499384AB50DF44F65298B
377p_4095n221 = 0x61310369972A4B9B00C77CD8A684A52B4022C66CC2886F384E528142345E2ACEABDBAC83F24EFCC857E3EEAB963F27181DDA55815ED64FAD9227AB5C396844A40CD5AD68AA34B4CF90603110B1D1C7D956ECEFA48210B81233903CE65CDACD88EB7689256846240A2C0E45BFBADEEF7E51F3C03844AED8C4F63C2698B01AC7EB524729C4027A54F8F3ECE58369147F3AFB702900833404CBFA3423350E21EE6F2AEB83F7FCE2FC5845B2E482BD823BD20A87348D64EE5DC9458556449719A006C16480BEF979204C8934FA4C56111C6431E687622A63AF2F6B3B8FECF8C17E6BEC9C64C02737E8F06245384BECE764016DD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
379p_5119d256 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE89A36D0A7F27637A69FA7A62E0497BC63E3F1C816F32AEAF17F7839D6750A178BB4B691A9922EAB7C9634D0F1491712278F84DA8FC1F472A05D101B8BE9CA1C44282F3AB0B081029CA3967363106F6FCB8542CFEBF9ED83C4B3A35DB0FC42E1FC21CFD1182E49B993A080BC3275B94EA17F8FBB0D7D4BCB3049D6C140A1869043F6460543CD4FEEDEED8D712D6419FE70166C3B8AECA00FACF147447A84B234E2851C58EAE204D626ACE863146FB74EB684C022F3BF3B8BF2CDA4F7A93742D0FB1BCEB40E0E8B01D90C4AFF7ED5B0050F67E9BF0C4A45B73197DE6FF68894CAE2C7B5846A541E178D4FCD073E1282F4488C33A0BFD91BFD26762233E12C84111AEB5BCD7C4C4A5ABFB99C416A83A8637CCF0F4A50FB6B4281CAF7EE5290777B47
381p_5119n234 = 0x62E64FC1B5AF0EE099BB15D13615399AD76B20FABEF18798B083E04CE2451C192143C7C1D20F8A1E50FAA444AF175E2E04721865ED0997D78BD72049D45279B635EFE6DB51E8E59A644F482580CD9B9DBE53A98B343F3C622B045EED32E38FFADCBF712BA03DAEE5C974DA9C0A26BBE16081614BCA1ACCD08CBCB1DAF42C60AE6EA2640F6059502C18620A81808843890899A4AA517F4ED87776734F954C25C1CDA1663A023E1580FF4744A13922A7787F1A3704DDD65B51048F961B403C1D1A3EF123FE4C97F45F72DE77EFAE82A1CF91C864163D716A77252A1760B77696E300C45106633A6509EF0F26BE1150D17484B0565BE4705039B328B7B9EE7144E65CB9A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
384p_6143d306 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8BCBFA770CD08125807E305692E3C85B91BF0FD94B1AA66D620CD5AFDC3FD8B70B2F4A6D658EB2C108D85F2FC4A7F0EBA11711559966812FEAB4D8146C14F63D4F6C2DDF7F95E57D79A1708A70B938D443A33F6414F596193254946C057E55E0EB64468AA7C74E27D4262760A518B88CD7416F87BFD6B50C1FA2F9632E83D3532E4C54DF2610070E2260AA68098D41D32ED17EBEF25AD80291737FCE124CA40B14CD8D2A541D7E7EE43B59BE50C34D88B9DBDDF0913E701827191891890BA18B4442C4616112857E33749315DC057E74137968E068ED50E366915A615D18677497F66D95620EA399670B8957BCB31FF0D04FCD7420DB636851A46A1C8F8E9335FB5A3231D0CC421605228CD7544FAD284FB65FBAB19A1D943894FDD32A95F2D3A4EAF0C54C75070ED12E86EF0BD593B69D11DADCF4C4CC9AE8F9F58286E779E101D4E920E9EA883676B558C2E054F62AB63B52A0466D1D8D558ACE1EE2DE0305CB1A97233
386p_6143n234 = 0x56B4BCED8AEA73BE1927D4EF3D7DB21FB945B92EEE78ED2804A1327FAE7CB74931FD3ACA6E4C4B2AF740E536D7BB40FA42F276570DCA14F666042E9C1C55A0186EF8C2449B804EF872624DB20E5E10E7AFD7393D49453BEFA55B1B74830F6D2449F507E5C96DB7129E88A38007D24055B73DCE9F93FE5DB63E32323BD5D45769715CC0B3CF5564813EC6A261669CF03B5DA022545A673DC2998FB078966081FD59F0A262F50EAD4F1FB6E7D530A42399C3E20E5C4ECE626888E6275289B449DA494D3705D8072B20C0C80910CD25F15FF80A94953B3536FDFDB8D5A9550772779D5D3B527B1BC15F7B5DD3071F9D7256400FF68A18FF7BF9598B645956AD5B63B79AA7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
388p_8191d306 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0005092EFE1954EBB40A5CC43278D477FD9E3EAB895B8F2DDBE5B21E0CFE797534FB57593D9CED0575EDB5B3C891BCD97F5C24D8225ED6BF593503E0E92D16B5817930E596246C7D9FA5C4E69BD697E5785E4029A6FCE266873B20072D9D77FBE3A6787D9505832B1C4CB8FBF8182DE87845FB05729FE0EB5D2E78E15A941D41085E07E5ABDBB810BA0B0CDA857D73EFEF39F186CA5B351388824A4401AD9C705758DD32F6A24BD885A87DE91F2ACB13EE80A20603BA5902790CB5A4DBA62746649523DE1E2E9EF976A1F71A5540135C50F4E2DA7E1DFBD362CC30CCEAEA80B9566007E22803F27E88038BA93DEFDCC41B1CC4AFE87D59271537740DB1E90108F580E913FDC38F9F2CA0009E839AB129D652A58322FAB0E170D65F12452E141AFE4B35F6ECFB3FC418A76092862349F03FBB55FA7711B3848BB2277A7F27EA7B2B5A1BEDF1BBF3302E59F5EC70E356FED1AE90629595BCA065091757DF032885E148C0DAB
390p_8191n332 = 0x4B9B357A60232E5AC7470A7824CC594F6A618A32EB1AEEA75F799EAC0B861CAC40BCC5A23DE5BA99D3F7B35C0FC8F8A41BBFCBA6431196F21DA8F5B1DFC31AFC17763F53A26B5483D1D5A3188BD0BE6C705865935F592D749340AB0C4766CF8CF2616719DD9B13472B78C46565423F31A12F9500A9B3D66A84E1817FD92CF87E830CCBFDC8059FE938D0057034AA944083E50ABFD32E5C2AF518C7F0B591DB109BCDA0D4A69044D67A798CFA07EEB100E577E8F21BD02023D8A40E685605795119E5597AE1971DB163F57525ABF66CAD4917AB4E63334B4D30AD9AE0E6E1190A71C548BDE8055E09AD7F4BD4563630EE40ABF73A93264D23FC3D664C235C4027E6B42ABB16E9E575DC21523AAEEDDE813AD33A6CC5ADEB9CA1C97E9060A18F98BBE35EF63F63990F91269D92DCF4CC1FC7D9FFFE10482C5A4DB7DE980091F6941E9448C6D4CD1D53621B3CE2C77236AA9FBE76B73A280F906A72468566F3C1023DB7539BEEBFFF2EAD9E18D4E9157AEB8764A2EBF92D04617F2A05570388B79BB97A231AA362C21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
392p_512k256 = 0x65b48e8f740f89bffc8ab0d15e3e4c4ab42d083aedc88c425afbfcc69322c9cda7aac6c567f35507516730cc1f0b4f25c2721bf457aca8351b81b90533c6c87b
394p_9215d384 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBA9E8D0D6E9647C535CB46390ED91FC7AB7043EB5A9C26EB56EBB88454A58C04553995209FDB2410C9C67866931FEAFC080BB4CC7FA187C8EA2BC31840C389EDBAEE5977D5A481BB874F0570EB0A90B188BF78E3116848B9F422B6BDC79FCFA5BEB1C951A307D90FA5A04E6D9BF026EBAFD375694158D9D49691E5D417608B3F969E83C4B10384F42A9D12ED50AA779290FB264E91A2E8C34A2DED0A3871578C01954350DF448D390A0E3F4A7B11F5B679A57CF74CDF1379FB85BC333D2984CD67DF800211ED3B655081ACF4283069139E3C1038A7E7CA1C359D6E1419E1595C3BCD44506EF8433ABA1C7C256A52C3798F0C512A845833F9CE9FE55E8DD29533658843F47960E92EE2CDDCFB5536967C535FE8CCC9E9C8D344E0F4E313378066BF91B95A5337EE185D4467A2C4D4B5997B38F79B7FB7B42C375B29A38B8F5C8069057CAC67235E887B4D8159BE72AE32E14D0FFD1B42A3FF326055B4C328CDAD6A75F5B23C399998F5DE800FEFECD8B3AFDAE00255184CB60E24E43A457BB6F7BE3D0421CEC679680564CE765691B9C8389AC3633D15CF94E29C45F1979022217553F152DB66127808BF4FFD6CD2BB454D63222DF2E9B7DC4A6ABDD88150FB50DA44CBAF5160B27205E82C68E055EF2EE83
396p_9215n332 = 0x7DF7C28395B5A01B518B53AC71139C6A145556C1B892C07C367DBC714BFEEC7366F0E3EFBFE5A5A65F5F7BBF11CE9313837428E0B986A282D7559348A8FDFA766A457E9318D9922D2C8413F0F32253D94EEB39491BDC0C4EE831DE131605B34CD4EAADBD5D9EAD8A2809A13DAD0A9B2106BC98495E15059F8A6331B6F7D6AA088011840ECACD8CA44C9ABC4F08F6F85705C0248B4AA0C05C5A3A0DA57D70045C8AC8DE54107E559AA00CDC0054B48C1454DB1E0996F98FBED3FD3664C9A41324ACB38BE87F529CF1D1459E3F44FFDC00B6DC4039EEBCFB5134013B530DF7D03966EB212139C99AFC5BF6E6F333198D8365874521776CDAB996181D63DE84F17DF32CCDC3454BDE1A0ECEDCA75E3430C937CBFE5D351ECA1F058834FADF86FAD8AD6E04EC7727347964607029754AFF6A141ED67C9C9E358A26A3E43778146000F4B1F779FD9CF1F272F291B0BF1BAEC6C7594D8E8457B0EA61DB53B76A2DA8DA05D0F62C1D2DBA9180CA327A4934E340E8FBB8442C96983C9AC3DA26FC7E839820BD7C85346ACDCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
422 "\nplease specify the prime and desired output [0 = assembly | 1 = UintHeader]\n")
427 if(prime==
"512k256"):
430 if(p.bit_length() > length):
431 print(
"\nError : prime p too long\n")
433 if(prime==
"2047n221"):
436 if(p.bit_length() > length):
437 print(
"\nError : prime p too long\n")
439 elif(prime==
"4095n221"):
442 if(p.bit_length() > length):
443 print(
"\nError : prime p too long\n")
445 elif(prime==
"5119n234"):
448 if(p.bit_length() > length):
449 print(
"\nError : prime p too long\n")
451 elif(prime==
"6143n234"):
454 if(p.bit_length() > length):
455 print(
"\nError : prime p too long\n")
457 elif(prime==
"8191n332"):
460 if(p.bit_length() > length):
461 print(
"\nError : prime p too long\n")
463 elif(prime==
"9215d384"):
466 if(p.bit_length() > length):
467 print(
"\nError : prime p too long\n")
470 print(
"\nError : no prime available for this length\n")
473 if int(argv[1]) == 0 :
478if __name__ ==
"__main__":
Print_Parameters(p, pbits, pbytes, pwords)
PrintHeader(pbits, pbytes, plimbs)
WordExtractor(p, pwords, Var)