# Inversion using Extended Euclidean algorithm.def EEA_invert(a, b): r = {}; s = {}; r[0] = a; r[1] = b; s[0] = 1; s[1] = 0 i = 1; while True: if r[i]==0: break q = r[i-1]//r[i]; r[i+1] = r[i-1] - q*r[i]; s[i+1] = s[i-1] - q*s[i] i += 1 return s[i-1] % b# Bitcoin's EC parameters: see https://en.bitcoin.it/wiki/Secp256k1G = '79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8'.replace(' ', '')gx, gy = int(G[:64], 16), int(G[64:], 16)p = 2**256 - 2**32 - 2**9 - 2**8 - 2**7 - 2**6 - 2**4 - 1# Calculate differential at the generator point. slope = (3*gx**2)*EEA_invert(2*gy, p) % p# Calculate x, y.x = (slope**2 - 2*gx) % py = (slope*(gx - x) - gy) % pprint(hex(x), hex(y))
('0xc6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5', '0x1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a')