有理分式的取模运算
引出
一些取模的基本运算:
(a+b)%p=(a%p+b%p)%p 对
(a-b)%p=(a%p-b%p)%p 对
(a×b)%p=(a%p×b%p)%p 对
(a/b)%p=(a%p/b%p)%p 错
一些符号的说明
≡: a≡b(mod p) 表示 a和b分别模p,余数相同,即a和b对p取模同余
乘法逆元的定义
若在mod p意义下,对于一个整数a,有a*p≡1(mod p),那么这个整数x即为a的乘法逆元,同时a也为x的乘法逆元
充要条件
a存在模p的乘法逆元的充要条件是gcd(a,p)=1,即a与p互质
有理分数的取模
求取(a/b)%p 等同于 a(b的逆元)%p
证明:
设b的x的逆元为x,即bx≡1(mod p)
对于式① (a/b)%p=m
①×b得② a%p=mb %p
②×x得③ ax=mbx %p
即 ax≡mbx (%p)
又因为 bx≡1(%p)
所以 ax≡m(%p)
因此 (a/b)%p=m 也就是 ax≡m(%p)
逆元的求解
费马小定理:假如a是一个整数,p是一个质数,那么
1.如果a是p的倍数,a^p≡a(%p)
2.如果a不是p的倍数,a^(p-1)≡1(%p)
又因a存在模p的乘法逆元的充要条件是gcd(a,p)=1,所以a肯定不是p的倍数,因此
a^(p-1)≡1(%p)
即 aa^(p-2)≡1(%p) a^(p-2)就是a的乘法逆元
a%p(a^(p-2)%p)=1%p
有理分数的取模运算
综上所述,得出结论:
(b/a)%p=(ba的逆元)%p=(ba^(p-2))%p
代码实现
代码出自:https://www.jianshu.com/p/d0a083a7e4c1
public class Mod {
public static final long MOD = 1_000_000_007;
/**
* 模乘
* @param x
* @param y
* @return x * y % MOD
*/
public static long mul(long x, long y) {
return ((x % MOD) * (y % MOD)) % MOD;
}
/**
* 模加
* @param x
* @param y
* @return (x + y) % MOD
*/
public static long add(long x, long y) {
return ((x % MOD) + (y % MOD)) % MOD;
}
/**
* 模快速幂
* @param x
* @param n
* @return x^n % MOD
*/
public static long quickPower(long x, long n) {
if (n == 0) return 1;
if (n == 1) return x % MOD;
long tmp = quickPower(x, n >> 1);
return (n & 1) == 0 ? mul(tmp, tmp) : mul(x, mul(tmp, tmp));
}
/**
* 分数求模
* 费马小定理 a^(p-1) mod p = 1 mod p
* a * a^(p-2) mod p = 1 mod p
* a^(p-2) mod p = a^(-1) mod p
* (b/a) % p = b * a^(-1) % p = b * a^(p-2) % p
* @param a 分母
* @param b 分子
* @return (b/a) % MOD
*/
public static long fractionMod(long a, long b) {
return mul(b, quickPower(a, MOD-2));
}
}

浙公网安备 33010602011771号