Python 在给定n,e和d的情况下,分解RSA素数p和q。SageMath实现。我收到一个错误

Python 在给定n,e和d的情况下,分解RSA素数p和q。SageMath实现。我收到一个错误,python,rsa,Python,Rsa,在这里,我认为“!”是阶乘。即使我把它修好了,也没什么变化。我收到了相同的错误。这是因为b不是整数而是有理数。即使b/2输出一个分数为零的数字,它仍然被认为是有理数(比如1.0而不是1)。快速模幂运算不能处理有理数,因此会产生错误 我尝试了你的代码,得到了与你相同的错误。我通过在计算b时对整数进行除法来解决这个问题,如下所示: while(b%2==0): b=b//2 请注意,print(t)让您相信t是一个整数,而它实际上是一个有理数,从而愚弄了您。你可以打印type(t)来证明这一点。好

在这里,我认为“!”是阶乘。即使我把它修好了,也没什么变化。我收到了相同的错误。

这是因为
b
不是整数而是有理数。即使
b/2
输出一个分数为零的数字,它仍然被认为是有理数(比如1.0而不是1)。快速模幂运算不能处理有理数,因此会产生错误

我尝试了你的代码,得到了与你相同的错误。我通过在计算
b
时对整数进行除法来解决这个问题,如下所示:

while(b%2==0):
b=b//2

请注意,
print(t)
让您相信
t
是一个整数,而它实际上是一个有理数,从而愚弄了您。你可以打印
type(t)
来证明这一点。

好的,我解决了这个问题。我提交了作业。这是最后的代码。它工作得非常好


    if (d != 1) and (d != n):
       
b=e*d-1
而(b%2==0):
b=b/2
其他:
t=int(b)
a=2
而(a
如果出现相同错误,请尝试将
b=b/2
替换为
b=b//2
。当然,从数字上来说,它应该始终是一个整数,但可能输入错误。我按你说的做了,错误消失了,但我无法打印p和q…:(我不明白为什么。该算法本应有效。这似乎或多或少是Menezes等人《应用密码学手册》8.2.2(I)中提到的算法的实现。但是,您的代码中的这一行
if(factorial(d)==1)和(factorial(d)==n):
在那种情况下没有意义,在我能想到的任何情况下都没有意义。它看起来是错误的。你是对的,我对那部分做了如下更改。如果(d!=1)和(d!=n):你没有纠正算法的实现。我建议你仔细阅读算法。
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-23-d05a9147cce3> in <module>
     17 a = Integer(2)
     18 while (a < n):
---> 19     x = power_mod(a, t, n) - Integer(1)
     20     d = gcd (x,n)
     21     a += Integer(1)
/ext/sage/sage-9.2/local/lib/python3.8/site-packages/sage/arith/misc.py in power_mod(a, n, m)
   2200 
   2201     apow = a % m
-> 2202     while n&1 == 0:
   2203         apow = (apow*apow) % m
   2204         n = n >> 1
TypeError: unsupported operand type(s) for &: 'sage.rings.rational.Rational' and 'int'

    if (d != 1) and (d != n):
       
b = e * d - 1
while (b % 2 == 0):
    b = b /2
else:
    t = int(b)
a = 2
while (a < n):
    x = power_mod(a, t, n) - 1
    d = gcd (x,n)
    a += 1
    if (d != 1) and (d != n):
        p = d
        q = n // d
        print(d)
        print(n // d)
        break