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
```

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.