1
+ from output import *
2
+ from tqdm import tqdm
3
+ from Crypto .Util .number import *
4
+
5
+ a = 143684642197375144177147158855853692668588800554193977558610296778751822580114038001358324581787378580872562099321966717548328915955931557014819660248335768703843650181118037332168940615255654385428471399452134131237486655430385594698984041709528412818098878208671854494888289862816247508570341341144291061804686340591902597677708742601740239151407141330097096057960696869868306378165361528290787726188133329061186703067302036544465101778190513113434324043654457
6
+ b = 167352289538521831900068303893849462884611879177327891332587809720230639559806397413772956644716449447590735981383896960276712495542059479149006336979727641959120139405218127535689160497885057304889947873643276371840497731671102379214228403473852990097216100053584104183830792848580118046966013781807107306470368639380702010022756255560693596301723230682190906560616366646290287284412622207608529405928696609593713613820866492056395760168172577692798799704251087
7
+ n = 591703505189598943502532470020819444351417786427559744959290752225569789666099653318864844640178933068932025277859268335616211431452288797227920690077916934058390749961256662320969850344143774517775954191622800337672863912047782627
8
+
9
+ NN = Zmod (n )
10
+
11
+ def add1 (P , Q ):
12
+ x1 , y1 , z1 = P
13
+ x2 , y2 , z2 = Q
14
+
15
+ s1 = (x1 * y2 - x2 * y1 ) * (y1 * z2 + y2 * z1 ) + (x1 * z2 - x2 * z1 ) * y1 * y2
16
+ s1 += - a * (x1 * z2 - x2 * z1 ) * (x1 * z2 + x2 * z1 ) - 3 * b * (x1 * z2 - x2 * z1 ) * z1 * z2
17
+ s2 = - 3 * x1 * x2 * (x1 * y2 - x2 * y1 ) - y1 * y2 * (y1 * z2 - y2 * z1 )
18
+ s2 += - a * (x1 * y2 - x2 * y1 ) * z1 * z2 + a * (y1 * z2 - y2 * z1 ) * (x1 * z2 + x2 * z1 )
19
+ s2 += 3 * b * (y1 * z2 - y2 * z1 ) * z1 * z2
20
+ s3 = 3 * x1 * x2 * (x1 * z2 - x2 * z1 ) - (y1 * z2 - y2 * z1 ) * (y1 * z2 + y2 * z1 )
21
+ s3 += a * (x1 * z2 - x2 * z1 ) * z1 * z2
22
+
23
+ assert s2 ^ 2 * s3 - s1 ^ 3 - a * s1 * s3 ^ 2 - b * s3 ^ 3 == 0
24
+
25
+ return [s1 , s2 , s3 ]
26
+
27
+ def add2 (P , Q ):
28
+ x1 , y1 , z1 = P
29
+ x2 , y2 , z2 = Q
30
+
31
+ t1 = y1 * y2 * (x1 * y2 + x2 * y1 ) - a * x1 * x2 * (y1 * z2 + y2 * z1 )
32
+ t1 += - a * (x1 * y2 + x2 * y1 ) * (x1 * z2 + x2 * z1 ) - 3 * b * (x1 * y2 + x2 * y1 ) * z1 * z2
33
+ t1 += - 3 * b * (x1 * z2 + x2 * z1 ) * (y1 * z2 + y2 * z1 ) + a ^ 2 * (y1 * z2 + y2 * z1 ) * z1 * z2
34
+ t2 = y1 ^ 2 * y2 ^ 2 + 3 * a * x1 ^ 2 * x2 ^ 2 + 9 * b * x1 * x2 * (x1 * z2 + x2 * z1 )
35
+ t2 += - a ^ 2 * x1 * z2 * (x1 * z2 + 2 * x2 * z1 ) - a ^ 2 * x2 * z1 * (2 * x1 * z2 + x2 * z1 )
36
+ t2 += - 3 * a * b * z1 * z2 * (x1 * z2 + x2 * z1 ) - (a ^ 3 + 9 * b ^ 2 ) * z1 ^ 2 * z2 ^ 2
37
+ t3 = 3 * x1 * x2 * (x1 * y2 + x2 * y1 ) + y1 * y2 * (y1 * z2 + y2 * z1 )
38
+ t3 += a * (x1 * y2 + x2 * y1 ) * z1 * z2 + a * (x1 * z2 + x2 * z1 ) * (y1 * z2 + y2 * z1 )
39
+ t3 += 3 * b * (y1 * z2 + y2 * z1 ) * z1 * z2
40
+
41
+ assert t2 ^ 2 * t3 - t1 ^ 3 - a * t1 * t3 ^ 2 - b * t3 ^ 3 == 0
42
+
43
+ return [t1 , t2 , t3 ]
44
+
45
+ def add (P , Q ):
46
+ x1 , y1 , z1 = add1 (P , Q )
47
+ x2 , y2 , z2 = add2 (P , Q )
48
+ return [(x1 + x2 ), (y1 + y2 ), (z1 + z2 )]
49
+
50
+ def mult (k , P ):
51
+ if k == 0 :
52
+ return (0 , 1 , 0 )
53
+ elif k == 1 :
54
+ return P
55
+
56
+ t = mult (k // 2 , P )
57
+ t = add (t , t )
58
+ if k % 2 == 1 :
59
+ t = add (t , P )
60
+ return t
61
+
62
+ P = [NN (chimera [0 ][0 ]), NN (chimera [0 ][1 ]), NN (1 )]
63
+ res = mult (26547499809981069510927003971948749075772722276992950364792314618117852191809368252259393907545335096600102525321072 , P )
64
+
65
+
66
+ print (gcd (int (res [0 ]), n ))
67
+ print (gcd (int (res [1 ]), n ))
68
+ print (gcd (int (res [2 ]), n ))
69
+
70
+ exit (0 )
71
+
72
+ # st = set()
73
+
74
+ # def backtrack(idx, val, upper):
75
+ # # print(idx, val)
76
+ # if idx == len(factors):
77
+ # global st
78
+ # st.add(val)
79
+ # # print(val)
80
+ # return
81
+
82
+ # if val * upper // factors[idx] >= MIN:
83
+ # backtrack(idx + 1, val, upper // factors[idx])
84
+ # if val * factors[idx] < MAX:
85
+ # backtrack(idx + 1, val * factors[idx], upper // factors[idx])
86
+
87
+ # backtrack(0, 1, gift)
88
+
89
+ # E = EllipticCurve(Zmod(n), [a, b])
90
+ # for v in tqdm(st):
91
+ # for xy in chimera:
92
+ # P, flag = E(*xy), False
93
+ # try:
94
+ # T = v * P
95
+ # except ZeroDivisionError:
96
+ # flag = True
97
+
98
+ # if not flag:
99
+ # break
100
+ # else:
101
+ # print(v)
102
+
103
+ pos = [
104
+ 26547499809981069510927003971948749075772722276992950364792314618117852191809368252259393907545335096600102525321072 ,
105
+ 22288483263012814591348765846880205017828692034537673547054108766305150848936155217127280012115743233530006890953060
106
+ ]
107
+
108
+ load ('coppersmith/coppersmith.sage' )
109
+
110
+ bounds = (floor (n ^ .25 ), floor (n ^ .25 ))
111
+ roots = tuple (randrange (bound ) for bound in bounds )
112
+ R = Integers (n )
113
+ P .< x , y > = PolynomialRing (R )
114
+ monomials = [x , y , x * y , x ^ 2 ]
115
+ f = (x - pos [0 ]) * (y - pos [1 ])
116
+ print (small_roots (f , bounds ))
117
+
118
+ # print("backtrack fin")
119
+ # Zn = Zmod(n)
120
+ # P.<x> = PolynomialRing(Zn)
121
+ # print(gift - pos[1] * pos[2])
122
+ # for v1 in pos:
123
+ # for v2 in pos:
124
+ # print(n - v1 * v2)
0 commit comments