初等数论(整除,模运算...)

整除

定义

a , b a,b a,b为整数 a ≠ 0 a≠0 a=0,如果存在一个整数 q q q,使得 a ∗ q = b a*q=b aq=b,则 b b b能被 a a a整除,记为 a ∣ b a|b ab,且称 b b b a a a的倍数, a a a b b b的因子.

整除的几个性质

  1. 传递性:如果 a ∣ b a|b ab b ∣ c b|c bc,则 a ∣ c a|c ac
  2. a ∣ b a|b ab a ∣ c a|c ac等价于对于任意的整数 x , y x,y xy,有 a ∣ ( b x + c y ) a|(bx+cy) a(bx+cy)
  3. m m m不为0,则 a ∣ b a|b ab等价于 m a ∣ m b ma|mb mamb
  4. 设整数 x , y x,y x,y满足下式: a x + b y = 1 ax+by=1 ax+by=1,且 a ∣ n a|n an b ∣ n b|n bn,那么 ( a b ) ∣ n (ab)|n (ab)n
  5. b = q ∗ d + c b=q*d+c b=qd+c,那么 d ∣ b d|b db的充要条件是 d ∣ c d|c dc



模运算

定义

对于整数 a , b a,b ab,其中 b b b不为0,求 a a a除以 b b b的余数,称为 a a a b b b,记为 a % b a\%b a%b

模运算的性质

  1. 分配率:模运算对加、减、乘具有分配率
    ( a + b ) % c = ( a % c + b % c ) % c (a+b)\%c=(a\%c+b\%c)\%c (a+b)%c=(a%c+b%c)%c
    ( a − b ) % c = ( a % c − b % c ) % c (a-b)\%c=(a\%c-b\%c)\%c (ab)%c=(a%cb%c)%c
    ( a ∗ b ) % c = ( a % c ∗ b % c ) % c (a*b)\%c=(a\%c*b\%c)\%c (ab)%c=(a%cb%c)%c
    ( a b ) % c = ( a % c ) b % c (a^b)\%c=(a\%c)^b\%c (ab)%c=(a%c)b%c
  2. 放缩性
    如果 a % b = c , d ≠ 0 a\%b=c,d≠0 a%b=c,d=0,则有 ( a / d ) % ( b / d ) = ( c / d ) (a/d)\%(b/d)=(c/d) (a/d)%(b/d)=(c/d)
    如果 a % b = c , d ∣ a , d ∣ b a\%b=c,d|a,d|b a%b=c,da,db,则 ( a / d ) % ( b / d ) = ( c / d ) (a/d)\%(b/d)=(c/d) (a/d)%(b/d)=(c/d).
    根据放缩性,则除法取余有这个式子:
    a / b % c = ( a % ( b ∗ c ) ) / b a/b\%c=(a\%(b*c))/b a/b%c=(a%(bc))/b


快速幂取模

快速幂

已知 a , b , p a,b,p a,b,p为整数,求 a b % p a^b\%p ab%p的结果.

可以用二进制倍增的思想,快速求幂.

a的b次方,可以看做是b个a相乘,b可以拆成2的幂的和,于是可以求出a的1次方,a的2次方,a的4次方, ,只要b的二进制的从右数第k位为1,则a的 2 k 2^k 2k方乘到结果里即可.
代码非常短小精悍:

LL ksm(LL a,LL b,LL p){
	LL res=1;
	while(b){
		if(b&1)res=res*a%p;
		a=a*a%p;
		b>>=1;
	}
	return res;
}

但是在 r e s = r e s ∗ a % p res=res*a\%p res=resa%p时, r e s ∗ a res*a resa可能就会爆精度,所以就有了接下来的快速乘。


快速乘

例:求 a ∗ b % p a*b\%p ab%p的结果,其中a,b,p都在长整型范围以内.保证p的两倍不超过长整型.

分析:如果两个大整数相乘,结果取幂,虽然结果在整型范围以内,但是中间结果可能超过长整型.

所以可以把乘法操作用加法来代替.借鉴快速幂的命名,我们将这种方法称为快速乘

LL ksc(LL a,LL b,LL p) {
	LL res=0;
	a%=p;
	while(b){
		if(b&1)res=(res+a)%p;
		a=(a+a)%p;
		b>>=1;
	}
	return res;
}

你可能感兴趣的:(数论,c++,数论)