Python 关于模运算的行为?
我用python为下面的codechef问题编写了以下程序 但是我的模函数不能正常工作,例如n=498 r=2 combo()返回的答案是0,因为q=243293343,r=1428355228Python 关于模运算的行为?,python,modulus,Python,Modulus,我用python为下面的codechef问题编写了以下程序 但是我的模函数不能正常工作,例如n=498 r=2 combo()返回的答案是0,因为q=243293343,r=1428355228 如何在arr[]中执行模运算以纠正此错误 找到了解决方案,回答了我自己的问题,但鼓励搜索优化版本 错误是 返回((q/r)%mod) mod为100000007是错误的,即素数,它必须写为 r=(arr[r]*arr[n-r])%mod 返回(q*功率(r,mod-2))%mod 幂函数是什么 def
如何在arr[]中执行模运算以纠正此错误 找到了解决方案,回答了我自己的问题,但鼓励搜索优化版本 错误是 返回((q/r)%mod) mod为100000007是错误的,即素数,它必须写为 r=(arr[r]*arr[n-r])%mod 返回(q*功率(r,mod-2))%mod 幂函数是什么
def Power(base,expo):
if(expo==0):
return 1
else:
if(expo&1):
return(base*Power(base,expo-1)%mod)
else:
root=Power(base,expo>>1)
return(root*root%mod)
但是,如果有人解释使用return(base*Power(base,expo-1)%mod)背后的数学原理,这将是非常有帮助的。当我们分割(a/b)%mod时,我们会这样做
(a/b)%MOD
(a*逆(b))%MOD//您必须找到b的逆。用费马定理求b的逆
注:永远不要将a/b除以,然后取MOD,首先求b的倒数,然后求a*b,然后对其进行MOD。上面的幂函数使用所谓的平方幂运算来计算O(log(b))中的a^b。想法很简单:
(a^2)^(b/2) if b is even and b > 0
a^b = a*(a^2)^((b-1)/2) if b is odd
1 if b = 0
这个想法可以很容易地实现,如下所示:
/* This function calculates (a^b)%c */
int modulo(int a,int b,int c)
{
long long x=1,y=a;
while(b > 0)
{
if(b%2 == 1)
{
x=(x*y)%c;
}
y = (y*y)%c; // squaring the base
b /= 2;
}
return x%c;
}
上面的幂函数只是一种递归方法。
当你问起这件事的时候
但是,如果有人能解释一下使用return(base*Power(base,expo-1)%mod)背后的数学原理,那将大有裨益
这与检查expo是否为奇数相同,然后将base乘以base^(expo-1),这样新的expo即(expo-1)将变为偶数,并且可以重复平方
有关更多信息,请参阅:
/* This function calculates (a^b)%c */
int modulo(int a,int b,int c)
{
long long x=1,y=a;
while(b > 0)
{
if(b%2 == 1)
{
x=(x*y)%c;
}
y = (y*y)%c; // squaring the base
b /= 2;
}
return x%c;
}