目录
- 解决思路
- 引用基础数学公式
- 公式1证明:
- 公式2证明:
- 公式3证明:
- 公式4,但无法证明
- 大数分解
解决思路
当一个幂运算很大,而模为整型数时,通常的做法(先求幂再取模),结果很大可能就是数溢出,无法表示这样的大数,导致运算失败。 可以先试着将数分割成几个部分,然后一个部分一部分的求取模数,从而实现目的。
引用基础数学公式
可以用数学公式解决的问题,千万别去计算能力暴力解决。因为可以用公式解决的问题,时间空间的复杂度很可能直接就是O(1)
公式1证明:
数学公式:
( a ∗ b ) m o d C = ( ( a m o d C ) ∗ b ) m o d C ; ( a , b , C 皆是是整数 ) (a * b ) \quad mod \quad C = (( a \quad mod \quad C) * b) \quad mod \quad C; (a, b, C 皆是是整数) (a∗b)modC=((amodC)∗b)modC;(a,b,C皆是是整数)
设:a=m+k, m 的值为 C 的 n 倍数(n>=0,且为整数), k < C
则:
( a ∗ b ) m o d C = ( ( m + k ) ∗ b ) m o d C = ( m b + k b ) m o d C = ( C n b + k b ) m o d C = k b m o d C \begin{align*} (a * b ) \quad mod \quad C&= ( ( m + k ) * b ) \quad mod \quad C \\ &= ( mb + kb ) \quad mod \quad C \\ &= ( Cnb + kb ) \quad mod \quad C \\ &= kb \quad mod \quad C \end{align*} (a∗b)modC=((m+k)∗b)modC=(mb+kb)modC=(Cnb+kb)modC=kbmodC
因为:
k = a m o d C k = a \quad mod \quad C k=amodC
所以:
( a ∗ b ) m o d C = ( ( a m o d C ) ∗ b ) m o d C (a * b ) \quad mod \quad C = ( ( a \quad mod \quad C ) * b ) \quad mod \quad C (a∗b)modC=((amodC)∗b)modC
公式2证明:
数学公式
a ∗ b m o d C = ( a m o d C ) ∗ ( b m o d C ) m o d C ( a , b , C 皆是是整数 ) a * b\quad mod \quad C = ( a\quad mod \quad C) * ( b\quad mod \quad C) \quad mod\quad C (a, b, C 皆是是整数) a∗bmodC=(amodC)∗(bmodC)modC(a,b,C皆是是整数)
设: a = m + k 1 , b = n + k 2 , m , n 的值为 C 的 x 倍数( x > = 0 ,且为整数) , k 1 , k 2 < C a=m+k_1, b=n+k_2, m,n的值为 C 的 x 倍数(x>=0,且为整数), k_1,k_2 < C a=m+k1,b=n+k2,m,n的值为C的x倍数(x>=0,且为整数),k1,k2<C
则:
a ∗ b = ( m + k 1 ) ∗ ( n + k 2 ) = m n + m k 2 + k 1 n + k 1 k 2 由于 m 和 n 都是 C 的 x 倍得到: = C x 1 C x 2 + C x 1 k 2 + k 1 C x 2 + k 1 k 2 m o d C = k 1 k 2 m o d C k 1 = a m o d C k 2 = b m o d C 可得: a ∗ b m o d C = ( a m o d C )