先来介绍一个相关的题,给定一个整型判定是否为3的幂,一般的是否为n的幂,因为指数增长,可以用空间换时间的方式,先存下来进行判定。
下来介绍一下大整数取模的方法:
“`
a.(ab)mod n = (a mod n)(b mod n)mod n,可以得到
123456789*987654321 = () (快速做选择题) D: 121932631112635269
在这里我们介绍以下三个公式:
**(a+b)mod n = ((a mod n)+ (b mod n))mod n;
(a-b) mod n = ((a mod n )- (b mod n)+n)mod n;
ab mod n = (a mod n) (b mod n) mod n****
<1>.大整数取模(sicily 1020)
这里要利用到公式:(a+b) mod (n) = (a mod n) + (b mod n) mod (n);
把大整数写成自左向右的形式:1234 = ((1*10+2)*10+3)*10+4,然后利用前面这个公式,每步取模,算法如下
<2> 幂取模(sicily 1294)
这也是用到了同余的性质:xy mod c = (x mod c)* (y mod c) mod c
<3>模线性方程
题意:输入正整数a,b,n,解方程ax ≡ b (mod n) a,b,n<=109 。
解答:
* a ≡ b(mod n)的意思是说“a 和 b关于模n 同余 ”,即a mod n = b mod n。而a ≡ b mod n 的充要条件是: (a-b) 是n 的整数倍。 这样,这个问题就变成了ax-b是n的正整数倍。设这个”倍数”是y,则ax - b = ny,即ax - ny= b,因此,这个就回到了解不定方程的问题。
* 比如给定方程ax +by +c = 0,求出满足这个方程的整数解(x,y).这里,我们首先来学习扩展欧几里德算法——找出一对整数(x,y),使得ax+by = gcd(a,b),这里的x,y不一定是整数,也可能是负数或者0,例如gcd(6,15) = 3,6*3 - 15*1 = 3,其中x = 3,y=-1;这个方程还有其他解,比如x = -2,y = 1