Math 在a^x=a(模n)中查找x

Math 在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的实用程序 解决标题中的问题需要找到离散对数,而对

我想计算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^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)