码迷,mamicode.com
首页 > 其他好文 > 详细

离散对数

时间:2015-09-15 23:15:38      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

离散对数就是解方程:

$$求最小的非负整数x满足,a^x \equiv b(mod n)$$

我们先谈论简单一点的,$gcd(a,n)=1$的情况:

$$求最小的非负整数x满足,a^x \equiv b(mod n),其中gcd(a,n)=1$$

记$m=\left \lfloor \sqrt{n} \right \rfloor$

那么$x$一定可以表示为$x=im+j(0\leq i\leq m,0\leq j< m)$

变形一下:

$a^{im+j} \equiv b(mod n)$

$a^{im}*a^j \equiv b(mod n)$

我们先用一个map保存所有$a^j(0\leq j< m)$的值,一共有$m$个。

枚举$a^{im}$,一共有$m$个,把$a^{im}$看成常数$a‘$,$a^{j}$看成未知数$x‘$,其实就变成解线性方程:$a‘x‘\equiv b(mod n)$

用拓展欧几里得,因为$gcd(a,n)=1$,所以$gcd(a^{im},n)=1$,即$gcd(a‘,n)=1$,所以一定有解。

求出未知数$x‘$后,我们再看看map里面是否有$a^j=x‘$,如果有,那么$j+im$就是一个解。

 好,我们现在来讨论$gcd(a,n)$不一定等于1的情况。

$$求最小的非负整数x满足,a^x \equiv b(mod n)$$

 我们想通过消因子,使得变成上面那种情况。

设$d=gcd(a,n)$,且$a=a‘d$,$n=n‘d$

变成:

(a‘d)^x \equiv b(mod n‘d)

显然如果$b\%d\neq 0$,那么一定没有解

假设现在$b\%d=0$,$b=b‘d$

变成:

$(a‘d)^x \equiv b‘d(mod n‘d)$

$a‘*(a‘d)^{x-1} \equiv b‘(mod n‘)$

$a‘*a^{x-1} \equiv b‘(mod n‘)$

很好,现在我们已经拿出来了一个因子$a‘$了

但是我们还是不能保证$gcd(a,n‘)=1$,但我们可以做多次,使得$gcd(a,n‘)=1$

核心代码如下:

LL c=1,cnt=0;
while(1)
  {
      LL d=gcd(a,n);
      if(d==1)break;
      if(b%d!=0)return 0;
      c*=a/d;
      cnt++;
      n/=d;
      b/=d;
  }

于是原问题变成:

$$求最小的非负整数x满足,c\times a^{x-cnt}\equiv b(mod n),其中gcd(a,n)=1$$

很好,变成上面那种情况了。

注意容易错的是,答案$x$有可能小于$cnt$,所以先要测试一下$0,1...,cnt-1$是否满足。

离散对数

标签:

原文地址:http://www.cnblogs.com/maijing/p/4793115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!