清北学堂—2020.1提高储备营—Day 4 morning(数论)

qbxt Day 4 morning

——2020.1.20 济南 主讲:李奥

目录一览

1.一些符号与基本知识
2.拓展欧几里得,逆元与欧拉定理
3.线性筛法与积性函数(非重点)

总知识点:数论

一、一些符号和基本知识

1.数论常用符号
(1).(x,y):x与y的最大公因数,即gcd(x,y)
(2).[x,y]:x与y的最小公倍数,即lcm(x,y)
(3).x≡y(mod n):x与y在模n意义下同余
(4).Def:定义(define)
(5).Thm:定理(theorem)
(6). ⇔:等价(充分必要条件)
(7).a|b:表示a整除b,即b是a的倍数,a是b的因子
2.基本知识
(1)快速幂
计算a^k mod n
时间复杂度O(log(k))

inline long long power(long long a, long long k){
    int ans=1;
    while(k){
        if(k&1)ans=ans*a%n;
        k>>=1;
        a=a*a%n;
    }
    return ans;
}

(2)辗转相除法(欧几里得算法):计算x,y的最小公倍数
时间复杂度O(log(max(x,y)))

inline int gcd(int x,int y){
    if(y==0)return x;
    return gcd(y,x%y);
}

二、拓展欧几里得算法

1.内容:一定存在整数a,b,使得ax+by=(x,y)
2.证明过程:
gcd(x,y)->gcd(y,x%y)
gcd(x,y)->gcd(y,x-⌊x/y⌋y)
如果已知a’y+b’(x- ⌊x/y⌋
y)=(x,y)
整理得b’x+(a’-b’⌊x/y⌋)y=(x,y)
最底层:x’=(x,y),y’=0
显然有1x’+0y’=(x,y)
于是可以递归求出a,b

3.代码:

inline int exgcd(int x,int y,int &a,int &b){
    if(y==0){
        a=1;
        b=0;
        return x;
    }
    int aa,bb,ans;
    ans=exgcd(y,x%y,aa,bb);
    a=bb;b=aa-bb*(x/y);
    return ans;
}

三、逆元

1.Def: 如果xy≡1(mod n),则在模n意义下,y为x的逆元,记为x-1
如果逆元存在,逆元有什么用?
x在模n意义下逆元是否存在?
∃y∈Z, xy≡1(mod n) ⇔ ∃ y, ∃y∈Z ,k∈Z xy+kn=1 ⇔ (x,n)=1
Thm:x在模n意义有逆元当且仅当(x,n)=1

2.计算方法:直接使用exgcd
其它计算方法:
线性求逆元
设n是一个质数,那么1到n-1都与n互质,因此1到n-1在模n意义下都有逆元(1的逆元为1)
对x(1<x<n)求逆元

设a=⌊n/x⌋,b=n%x
n=ax+b
b=-a
x
b-1b=-b-1a x
1≡-b-1ax(mod n)
-b-1*a即为x的逆元
x的逆元可以用比他小的数的逆元得到

递推可以求得1到n-1在模n意义下的逆元

代码:

inv[1]=1;
for(i=2;i<=n-1;i++)
   inv[i]=(n-inv[n%i]*(n/i)%n)%n;

四、欧拉定理

(1)欧拉函数φ
Def : φ(i)表示1到i中有多少个数与i互质(i∈N+)
对于质数p
φ(p)=p-1
φ(pk)=(p-1)*pk-1
(2)定理内容
若a与n互质,则aφ(n) ≡1(mod n)
推论:若a与n互质,x≡y(mod φ(n)),则ax≡ay(mod n)

aφ(n)≡1(mod n)
a*aφ(n)-1≡1(mod n)
aφ(n)-1 即为a在模n意义下的逆元
当n为质数时,a的逆元为an-2

五.积性函数

(1)Def:对于一个定义域为N+或是1到n的函数f(x),如果满足以下两条性质,称其为积性函数
1.f(1)=1
2.∀a,b∈N+ ,若(a,b)=1,则f(a)f(b)=f(ab)

Def:对于一个定义域为N+或是1到n的函数f(x),如果满足以下两条性质,称其为完全积性函数
1.f(1)=1
2.∀a,b∈N+ , 则f(a)f(b)=f(ab)

(2)常见的积性函数举例
Id:单位函数,Id(x)=x
Idk:幂函数,Idk (x)=xk
φ:欧拉函数
μ:莫比乌斯函数
∊:单元函数 ∊(1)=1, ∊(x)=0(∀x≥2)
1:1(x)=1 (∀x≥1)
d:d(x)表示x的约数个数

(3)
线性筛积性函数
对于积性函数f
在较小时间复杂度内算出f(pk)
对于含有多个质因子的数x,记录x除尽MinP[x]因子后的值,记为w[x]

代码:

f[1]=1;
for(i=2;i<=n;i++){
   int j=i/MinP[i];
   if(MinP[j]==MinP[i]) w[i]=w[j];
   else w[i]=j;
   if(w[i]==1){
      //i为pk,直接计算
   }
   else f[i]=f[w[i]]*f[i/w[i]];
}

--------------------------------------------------THE END-------------------------------------------------

猜你喜欢

转载自www.cnblogs.com/RiaOIer-Blog/p/12303006.html