离散对数

离散对数就是解方程:

$$求最小的非负整数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$是否满足。

时间: 2024-10-15 12:05:32

离散对数的相关文章

HDU 4887 Endless Punishment (矩阵离散对数)

题意: 给你两个长度为n(n <= 31)的01序列A, B,问A序列最少改变多少次能变成B序列.序列的一次改变是这样的,首先有两个集合S1.S2,每个集合中表示的都是下标,如果集合S1中1的个数是奇数个,那么把序列的第一个数去掉,然后在尾部加上一个数1,偶数个的话则是加上一个数0,然后将S2集合对应的位置异或一下,这就是改变了一次. 思路:由于n<=31,即可知总的不同序列个数是2^n.对于一个序列的一次改变,可以构造个转移矩阵,那么改变一次其实就是乘一次这个矩阵,设初始矩阵是A, 转移矩阵

BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Status][Discuss] Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中

[uva11916] Emoogle Grid (离散对数)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud  Emoogle Grid  You have to color an MxN ( 1M, N108) two dimensional grid. You will be provided K ( 2K108) different colors to do so. You will also be provided a list of B ( 0B500) list of blo

HDU 2815 Mod Tree 离散对数 扩展Baby Step Giant Step算法

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意: 思路:与上题不同,这道题不要求m是素数,是利用扩展Baby Step Giant Step算法求离散对数. 以下转载自:AekdyCoin [扩展Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 无限制(当然大小有限制--) [写在前面] 这个问题比较麻烦,目前网络上流传许多版本的做法,不过大部分已近被证明

UVA - 11916 Emoogle Grid (离散对数取模)

You have to color an M x N (1M, N108) two dimensional grid. You will be provided K (2K108) different colors to do so. You will also be provided a list of B (0B500)list of blocked cells of this grid. You cannot color those blocked cells. A cell can be

POJ 2417 Discrete Logging 离散对数

链接:http://poj.org/problem?id=2417 题意: 思路:求离散对数,Baby Step Giant Step算法基本应用. 以下转载自:AekdyCoin [普通Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 为素数 [思路] 我们可以做一个等价 x = i * m + j  ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C

离散对数,giant-step baby-step,拓展giant-step baby-step (poj 2417, hdu 2815)

普通giant-step baby-step: poj 2417 题意: B^L==N(MOD P), 给出P,B,N, 求最小的非负L. 限制: 2 <= P < 2^31 && P为素数; 2 <= B <P; 1 <= N < P 思路: 离散对数,用giant-step baby-step解决. 普通giant-step baby-step过程,要求P为素数: 令s = ceil(sqrt(P)), 则L = b * s + r (0 <=

欧拉定理与费马定理,离散对数定理

费马小定理是数论中的一个定理: 假如a是一个整数,p是一个质数,那么是p的倍数,可以表示为 如果a不是p的倍数,这个定理也可以写成 这个书写方式更加常用. 欧拉定理(也称费马-欧拉定理或欧拉函数定理)是一个关于同余的性质.欧拉定理表明,若为正整数,且互素(即),则 即与1在模n下同余:φ(n)为欧拉函数.欧拉定理得名于瑞士数学家莱昂哈德·欧拉. 如果p是素数,那么 欧拉定理与费马定理,离散对数定理

[bzoj3992][SDOI2015]序列统计——离散对数+NTT

题目大意: 给定一个数字不超过\(m\)的集合\(S\),用\(S\)中的数生成一个长度为\(n\)的序列,求所有序列中的元素乘积模\(m\)等于\(x\)的序列的个数. 思路: 考虑最朴素的\(DP\),设\(f_{i,j}\)为选了\(i\)个数,乘积模\(m\)余\(j\)的方案数,直接转移的时间复杂度是\(O(nm^2)\)的. 不难发现每次转移的过程是相同的,矩阵加速显然不太可行,考虑将乘法形式的转移变成加法形式的转移,这样每次转移即可用NTT优化. 这里需要用到一个叫做离散对数的东西