欢迎来到下蛋爷之家|

下蛋爷

园龄:4年2个月粉丝:8关注:23

数论学习笔记

概念不说了。

同余方程

同余方程基本形式:axc(mod b)

axc(mod b)yZ,s.t.ax+by=c

ax+by=c 就可以用扩展欧几里得来求。

代码:

int exgcd (int a, int b, int& x, int& y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}

乘法逆元

ax1(mod p),并且 (a,p)=1,则称 axmod p 下互为逆元,x=inv(a)

求解乘法逆元的方法:

  1. 扩欧,相当于 解 ax1(mod p)。适合求某一个数的逆元。
  2. 费马小定理,若 p 是质数,且 (a,p)=1,则 ap11(modp),那么 inv(a)=ap2。适用于 p 为质数的情况。
  3. 线性递推求逆元,适合求 1n 的逆元。

 p=aq+r,q=par=pmodaaq+r0(mod p)aqr(mod p)arinv(q)(mod p)inv(a)qinv(r)(mod p) inv[a]=painv[pmoda]

总之,我觉得要求单个的逆元就用扩欧,多个的逆元就用线性递推,费马小定理随便。

中国剩余定理

这里直接讲扩展中国剩余定理。

定义:线性同余方程组,不要求模数两两互质。

{p1a1(mod m1)p2a2(mod m2)      pnan(mod mn)

就是求这个方程的一个解。

解法

采用数学归纳法。

  1. 假设前 k1 个方程的特解为 x,那么通解为 x+tM,其中 M=lcm(m1,m2,,mk1)
  2. 求解 t,使得 x+tMak(mod mk)
  3. exgcd 判断是否有解,若有解,则 xx+tM

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int kMaxN = 1e5 + 5;
int n, a[kMaxN], b[kMaxN];
int M = 1;
__int128 res, x, y;
__int128 mod (__int128 x, __int128 m) {
return (x % m + m) % m;
}
__int128 add (__int128 x, __int128 y, __int128 m) {
return (x + y >= m) ? (x + y - m) : (x + y);
}
__int128 times (__int128 x, __int128 y, __int128 m) {
return 1ll * x * y % m;
}
__int128 gcd (__int128 m, __int128 n) {
return (!n) ? m : gcd(n, m % n);
}
__int128 lcm (__int128 m, __int128 n) {
return m / gcd(m, n) * n;
}
__int128 exgcd (__int128 a, __int128 b, __int128& x, __int128& y) {
if (!b) {
x = 1, y = 0;
return a;
}
__int128 d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
__int128 inv (__int128 a, __int128 m) {
__int128 x, y;
exgcd(a, m, x, y);
return mod(x, m);
}
signed main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> b[i];
}
res = b[1], M = a[1];
for (int i = 2; i <= n; ++i) {
__int128 s = mod(b[i] - mod(res, a[i]), a[i]);
__int128 d = exgcd(M, a[i], x, y);
__int128 m = M;
M = lcm(M, a[i]);
x = mod(times(x, s / d, a[i]), a[i]);
// cout << "***" << i << ' ' << res << endl;
res += times(x, m, M);
res = mod(res, M);
}
// cout << exgcd(4, 48, x, y) << endl;
cout << (long long)res << endl;
return 0;
}

欧拉函数

对于 nZ+φ(n) 表示 1n 中与 n 互质的正整数个数。

  • 性质一:若 p 是质数,φ(pn)=pn1(p1)
  • 性质二:若 a|xφ(ax)=aφ(x)
  • 性质三:若 (a,b)=1φ(ab)=φ(a)φ(b)

公式:

If n=i=1kpiαi,then φ(n)=ni=1kpi1pi

欧拉定理

(a,m)=1aφ(m)1(mod m)

推论:ababmodφ(m)(mod m)

bφ(m),则 ababmodφ(m)+φ(m)(mod m)

posted @   下蛋爷  阅读(66)  评论(3编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起