1 | initial version |
You probably want (p-3)/4
instead of (p-1)/4
in the definition of x1
, since this affectation takes place only if the if
clause failed, meaning that (p - 3) % 4
is zero.
The reason it works in Python is that in Python, if k
is an integer, k / 4
returns the integer part of k
over 4
, while in Sage, it returns a rational. The error message said:
TypeError: unable to convert x (=1146...9104*(1205...3824*sqrt(42))) to an integer
which tells you a square root was being extracted, and this could only happen at the exponentiation step mp**((p-1)/4)
(in your example, (p-1)/4
is a half-integer).
Note that you can force integer division by using //
instead of /
, so you could write x1 = mp**((p-1)//4) % p
.
Combining these two tricks, your code becomes:
sage: def decriptograph(n,m):
....: p, q = factor(n)
....: p, q = p[0], q[0]
....: mp, mq = m % p, m % q
....: if (p - 3) % 4 or (q - 3) % 4:
....: return -1
....: x1 = mp ** ((p - 3) // 4) % p
....: return x1
....:
sage: decriptograph(328419349,249500293)
5641