分数模
最近遇到要计算分数模的问题(1/9*(5-8*6)%10 and 1/5 mod 18 ),然后搜索了很多资料,暂时解决了我的问题,记录如下:
首先要先了解一下正负数求模问题,因为负数求模和正数求模过程不一致
其次要知道一些模运算规则,因为一些模运算规则可以快速节省求解时间
最后就是求模的过程
1、带正负的模运算
正数的模运算和取余运算一致,但是负数的求模运算则要带符号,如下:
7 mod 4 = 3(商 = 1 或 2,1<2,取商=1)
-7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2)
7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2)
-7 mod -4 = -3(商 = 1或2,1<2,取商=1)
2、模运算相关规则
转载链接:http://www.hankcs.com/program/cpp/poj-1995-raising-modulo-numbers.html
基本性质:
-
若p|(a-b),则a≡b (% p)。例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7)
-
(a % p)=(b % p)意味a≡b (% p)
-
对称性:a≡b (% p)等价于b≡a (% p)
-
传递性:若a≡b (% p)且b≡c (% p) ,则a≡c (% p)
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (1)
(a – b) % p = (a % p – b % p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
(a^b) % p = ((a % p)^b) % p (4)
结合律:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
交换律:
(a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
分配律:
((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)
重要定理:
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a – c) ≡ (b – d) (%p),
(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)
note:
≡ (同余号,也是恒等号)
两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余 记作 a ≡ b (mod m) 读作a同余于b模m,或读作a与b关于模m同余。 比如 26 ≡ 14 (mod 12)
3、模运算定义
但是我这里并没有用到所谓的模运算定义(x=a/b mod n 等同于 bx=a + nk)
根据模运算性质,当a与n互素时,(axb)≡(axc)(mod n) 等同于 b ≡ c ( mod n)。故有:
1)1/5 (mod 18 )
改成 n≡1/5 (mod 18)
变换成 5n ≡ 1 (mod 18)
继续变换成 5n mod 18= 1
令 n = 1,2,3,4,...
当n=11 时, 5n mod =18 ,因此 1/5 mod 18 =11
2)1/9 (mod 10)
改成 n ≡ 1/9(mod 10)
变换成 9n ≡ 1(mod 10)
继续变换成 9n mod 10 = 1
令 n =1,2,3,...
当n=9时,9n mod 10 = 1,因此1/9 (mod 10)=9
3)1/9(5-8*6)%10
根据模运算(3),原式可得:
((1/9%10)(-43%10))%10
=(9*(-3))%10
=3
注:(9*(-3))%10
值为-3,模为3(区别正负数取模)