Math 在a^x=a(模n)中查找x
我想计算am mod n,其中n是一个素数,m非常大。与其用二进制幂计算,我想找到这样的x,即ax=a(mod n),然后计算a(m mod x)mod nMath 在a^x=a(模n)中查找x,math,equation,numerical-methods,modular-arithmetic,Math,Equation,Numerical Methods,Modular Arithmetic,我想计算am mod n,其中n是一个素数,m非常大。与其用二进制幂计算,我想找到这样的x,即ax=a(mod n),然后计算a(m mod x)mod n 显然,对于任何a,都存在这样的x,因为在某个点上幂模n循环,但我没有找到如何用模运算来计算它。我想知道我是否遗漏了什么,或者是否存在一些数值方法?计算am mod n的标准方法是使用您提到的典型的二进制指数法,同时保持问题的可处理性。注意“在密码学中的使用”一节,它解释了计算am mod n的实用程序 解决标题中的问题需要找到离散对数,而对
显然,对于任何a,都存在这样的x,因为在某个点上幂模n循环,但我没有找到如何用模运算来计算它。我想知道我是否遗漏了什么,或者是否存在一些数值方法?计算am mod n的标准方法是使用您提到的典型的二进制指数法,同时保持问题的可处理性。注意“在密码学中的使用”一节,它解释了计算am mod n的实用程序
解决标题中的问题需要找到离散对数,而对于离散对数,没有已知的有效解决方案。解决离散对数问题的困难是许多密码系统的基础 你的模是素数,这使得开始很容易,就像费马(不恰当地称为“小”)定理那样,然后
a^n ≡ a (mod n)
对于所有a
。这个公式是等价的
a^(n-1) ≡ 1 (mod n), if n doesn't divide a.
那你有
a^m ≡ 0 (mod n) if a ≡ 0 (mod n) and m > 0
及
(请注意,您建议的a^(m%x)
通常是不正确的,如果m=q*x+r
,您将
a^m ≡ (a^x)^q * a^r ≡ a^q * a^r ≡ a^(q+r) (mod n)
您需要对q+r
重复该缩减,直到获得小于x
的指数
如果你真的对最小的x>1感兴趣,那么a^x≡ a(mod n)
,同样是a的情况≡ 0(mod n)
是微不足道的[x=2
],对于其他情况,让y=min{k>0:a^k≡ 1(mod n)}
,然后期望的x=y+1
,并且,由于环Z/(n)
中的单元形成顺序n-1
的(循环)群,我们知道y
是n-1
的除数
如果你有n-1
的因式分解,那么就很容易找到和检查y
的除数和候选除数,因此找到y
并不需要太多工作,但是对于单个0^
来说,它通常比计算a^r(mod n)
的工作量要大得多?made
@GrijeshChauhan:谢谢)我认为关于离散对数的评论是误导性的:在这个特殊情况下(发现x>1,使得a^x=a(mod n)),这实际上不是关于发现离散对数;对于有趣的情况(其中a相对素数为n),困难的部分是找到模n的单元组的阶,并且(如果你想找到所有解x)也要找到该阶的素数分解。即使已知p-1的因式分解,也很难找到模为素数p的离散对数。
a^m ≡ (a^x)^q * a^r ≡ a^q * a^r ≡ a^(q+r) (mod n)