浅涉算法竞赛中的初等数论

1、欧几里得算法

基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。
应用:求最大公约数。
证明:设b = qa + r
假设d是a,b的一个公约数,则有
  d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
所以(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等。

2、扩展欧几里得

基本算法:对于不完全为 0 的非负整数 a、b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x、y ,使得ax+by=gcd(a,b)ax + by = gcd(a,b)
证明:
设 a>b。
1、显然当 b=0,gcd(a,b)=ab=0,gcd(a,b)=a,此时 x=1,y=0x=1,y=0;
2、ab≠0ab=\not 0 时
 有 ax1+by1=gcd(a,b) bx2+(amod  b)y2=gcd(b,amod  b)ax_1+by_1=gcd(a,b)\\   bx_2+(a \mod b)y_2=gcd(b,a\mod b)  
根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,amod  b)gcd(a,b)=gcd(b,a \mod b)
则ax1+by1=bx2+(amod  b)y2ax_1+by_1=bx_2+(a \mod b)y_2
ax1+by1=bx2+(a−⌊ab⌋∗b)y2=ay2+bx2−⌊ab⌋∗by2\begin{aligned}ax_1+by_1&=bx_2+(a-\lfloor{\frac{a}{b}}\rfloor*b)y_2\\&=ay_2+bx_2-\lfloor{\frac{a}{b}}\rfloor*by_2\end{aligned}
⟹{x1=y2y1=x2−⌊ab⌋∗y2\Longrightarrow \left\{ \begin{aligned} x_1=y_2 \\ y_1=x_2-\lfloor{\frac{a}{b}}\rfloor*y_2 \end{aligned} \right.

这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
  上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
应用:

  • 求解不定方程;
  • 求解模线性方程(线性同余方程);
  • 求解模的逆元.

poj1061 青蛙的约会(不定方程+逆元)

3、欧拉筛

O(n)的算法,记录下每个素因子,向后标记。

int prime[maxn];
int visit[maxn];
void Euler_Prime(){
    for (int i = 2;i <= maxn; i++) 
    {
        if (!visit[i]) prime[++prime[0]] = i;    //纪录素数,prime[0]用来计数
        for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) 
        {
            visit[i*prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
}

4、乘法逆元

前言:
我们知道在模意义下的加减乘运算都是具有封闭性的,但除法确是例外。
乘法逆元就是一种在模意义下代替除法运算的东西

定义:
如果有ab≡1(modp),则称b是mod p意义下a的乘法逆元。记b = inv(a) 或 b = a−1
(定义了剩余系中的除法)

性质:
一个数有逆元的充分必要条件是gcd(a,n) = 1,此时逆元唯一存在。
abmod&ThinSpace;&ThinSpace;p=((amod&ThinSpace;&ThinSpace;p)∗(bmod&ThinSpace;&ThinSpace;p))mod&ThinSpace;&ThinSpace;p\dfrac{a}{b}\mod p = ( (a \mod p) * (b \mod p) ) \mod p
求法:

  • 扩展欧几里得
    ax≡1(mod p)
    可以等价的转化为ax+py=1
    复杂度O(log n)
  • 费马小定理
    由ap−1≡1(mod p)
    得a×ap-2≡1(mod p)
    所以当模数是一个质数的时候,可以用费马小定理求解,即inv(i)=ip-2(mod p),复杂度O(log n)
  • 欧拉定理
    适用于模数不是素数
  • 递推
inv[i] = (p - p/i) * inv[p%i] % p;

5、欧拉函数


应用

  • 既约真分数(poj 2478)

给出整数n,让你求解分母小于n的所有既约真分数的个数。

分析:首先我们要搞懂什么是既约真分数,简单来说,就是小于1的最简分数。那么我们很容易将其与欧拉函数联系起来,因为对于一个分母为n的既约真分数的个数,实际上就是phi(n),那么这个问题本质上就是求解phi(2)+…+phi(n).

  • 精简打表数据.(uva 10820)

输入两个整数x、y(均小于等于n),输出某个函数值f(x,y),一位选手想打表,但是如果全部打出来的话会造成内存超限,需要精简。

分析:通过“f(x,y)计算f(x,y)”这个题设条件,我们就能够将其联想到欧拉函数。最终表中存的二元组(x,y)只要互素,就能够保证表中不存在任何“赘余(即可由表中的另外某组数据计算得来)”数据.
假设x>y,那么我们枚举x=2、3、…、n,二元组的数量应该是phi(2)+…+phi(n),由对称性,最终结果应该乘2,而且不要忘记了(1,1)这个特殊情况。

最终结果应该是2(phi(2)+…+phi(n)) + 1.

posted @ 2019-02-10 00:27  Mr.doublerun  阅读(220)  评论(0)    收藏  举报