def GCD(a, b):
prevx, x = 1, 0
prevy, y = 0, 1
while b:
q = a/b
x, prevx = prevx - q*x, x
y, prevy = prevy - q*y, y
a, b = b, a%b
return a, prevx, prevy
def modinv(x, m):
(gcd, c, d)= GCD(x,m)
if c<0:
c += m
return c
q = 2**256 - 432420386565659656852420866394968145599
r = 0x00b92c3636e4da4695edcda35b3d46b4947030a0d857dc5328cfec1d99791a2cb8
s1 = 0x21edb7571d5739fe99a7af5962c012dcc7519c90e1212c46290184adab3c5a1c
s2 = 0x5ebcc3d68736aea8faecfcdfe856e0c60608b7a9a6ddb77e093e9b59f137a1ab
m1 = 0x52a65bd03910488747b140f308546971dfe6252da65dbcdfa7c9adfe6e1abcfa
m2 = 0xbdc035eea888a7e6a154f09a5fd5bb0671eaa70c4a29b3c69d764232dd983a40
print "%x" % (m1-m2) # -c92fa3379640006d2eae6af7760f4180d0cf13d3f49da60c183e0ba07a1caffe
print "%x" % (s1-s2) # db4297e4f61d4c83ecaa00574d8cce2f9a531f164d28166ee484c58e92628104
mi = modinv(s1-s2, q)
print "%x" % mi # 7369938cee97daa2c7e2b9aab4c07d7ba1189e177499caf6a2de68a71427428f
k = ((m1-m2)*mi) % q
print "k = %x" % k # 6e3469cb1dec3ce994dfc5c88bb53971fe513749727bdfa4a44a38f294008136
rinv = modinv(r, q)
xx = (s1*k-m1) % q
print "xx=%x" % xx # 8321bc4f5e0a2973e5bdc9ba8194cc62c5be375216832cb5c04c28cab035dd42
x = (xx * rinv) % q
print "x=%x" % x # 1930a0cb6fe514b9ab03c652a61ac53b2c7ee6db417543de782503e690fab966
CmRlZiBHQ0QoYSwgYik6CiAgICBwcmV2eCwgeCA9IDEsIDAKICAgIHByZXZ5LCB5ID0gMCwgMQogICAgd2hpbGUgYjoKICAgICAgICBxID0gYS9iCiAgICAgICAgeCwgcHJldnggPSBwcmV2eCAtIHEqeCwgeAogICAgICAgIHksIHByZXZ5ID0gcHJldnkgLSBxKnksIHkKICAgICAgICBhLCBiID0gYiwgYSViCiAgICByZXR1cm4gYSwgcHJldngsIHByZXZ5CgoKZGVmIG1vZGludih4LCBtKToKICAgIChnY2QsIGMsIGQpPSBHQ0QoeCxtKQogICAgaWYgYzwwOgogICAgICAgIGMgKz0gbQogICAgcmV0dXJuIGMKCnEgPSAyKioyNTYgLSA0MzI0MjAzODY1NjU2NTk2NTY4NTI0MjA4NjYzOTQ5NjgxNDU1OTkKCnIgPSAweDAwYjkyYzM2MzZlNGRhNDY5NWVkY2RhMzViM2Q0NmI0OTQ3MDMwYTBkODU3ZGM1MzI4Y2ZlYzFkOTk3OTFhMmNiOApzMSA9IDB4MjFlZGI3NTcxZDU3MzlmZTk5YTdhZjU5NjJjMDEyZGNjNzUxOWM5MGUxMjEyYzQ2MjkwMTg0YWRhYjNjNWExYwpzMiA9IDB4NWViY2MzZDY4NzM2YWVhOGZhZWNmY2RmZTg1NmUwYzYwNjA4YjdhOWE2ZGRiNzdlMDkzZTliNTlmMTM3YTFhYgptMSA9IDB4NTJhNjViZDAzOTEwNDg4NzQ3YjE0MGYzMDg1NDY5NzFkZmU2MjUyZGE2NWRiY2RmYTdjOWFkZmU2ZTFhYmNmYQptMiA9IDB4YmRjMDM1ZWVhODg4YTdlNmExNTRmMDlhNWZkNWJiMDY3MWVhYTcwYzRhMjliM2M2OWQ3NjQyMzJkZDk4M2E0MAoKcHJpbnQgIiV4IiAlIChtMS1tMikgIyAtYzkyZmEzMzc5NjQwMDA2ZDJlYWU2YWY3NzYwZjQxODBkMGNmMTNkM2Y0OWRhNjBjMTgzZTBiYTA3YTFjYWZmZQpwcmludCAiJXgiICUgKHMxLXMyKSAjIGRiNDI5N2U0ZjYxZDRjODNlY2FhMDA1NzRkOGNjZTJmOWE1MzFmMTY0ZDI4MTY2ZWU0ODRjNThlOTI2MjgxMDQKCm1pID0gbW9kaW52KHMxLXMyLCBxKQpwcmludCAiJXgiICUgbWkgICMgNzM2OTkzOGNlZTk3ZGFhMmM3ZTJiOWFhYjRjMDdkN2JhMTE4OWUxNzc0OTljYWY2YTJkZTY4YTcxNDI3NDI4ZgoKayA9ICgobTEtbTIpKm1pKSAlIHEgCnByaW50ICJrID0gJXgiICUgayAjIDZlMzQ2OWNiMWRlYzNjZTk5NGRmYzVjODhiYjUzOTcxZmU1MTM3NDk3MjdiZGZhNGE0NGEzOGYyOTQwMDgxMzYKCnJpbnYgPSBtb2RpbnYociwgcSkKeHggPSAoczEqay1tMSkgJSBxCnByaW50ICJ4eD0leCIgJSB4eCAjIDgzMjFiYzRmNWUwYTI5NzNlNWJkYzliYTgxOTRjYzYyYzViZTM3NTIxNjgzMmNiNWMwNGMyOGNhYjAzNWRkNDIKeCA9ICh4eCAqIHJpbnYpICUgcQpwcmludCAieD0leCIgJSB4ICMgMTkzMGEwY2I2ZmU1MTRiOWFiMDNjNjUyYTYxYWM1M2IyYzdlZTZkYjQxNzU0M2RlNzgyNTAzZTY5MGZhYjk2Ngo=