Java 逆模问题,其中gcd(分母,mod)=1.
如何计算Java 逆模问题,其中gcd(分母,mod)=1.,java,c,algorithm,math,data-structures,Java,C,Algorithm,Math,Data Structures,如何计算F(n)%mod其中mod是一个素数。 和F(n)=n/(q!^r)%mod…(x^r代表pow(x,r)) 我用费马的小定理来计算逆模,但我面临的问题是,费马只有在gcd(分母,mod)=1时才适用 那么还有其他方法可以解决这个问题。如果模是素数,可以使用扩展的欧几里德算法计算逆: function inverse(x, m) a, b, u = 0, m, 1 while x > 0 q = b // x # integer division
F(n)%mod
其中mod
是一个素数。
和F(n)=n/(q!^r)%mod
…(x^r
代表pow(x,r)
)
我用费马的小定理来计算逆模,但我面临的问题是,费马只有在gcd(分母,mod)=1
时才适用
那么还有其他方法可以解决这个问题。如果模是素数,可以使用扩展的欧几里德算法计算逆:
function inverse(x, m)
a, b, u = 0, m, 1
while x > 0
q = b // x # integer division
x, a, b, u = b % x, u, x, a - q * u
if b == 1 return a % m
error "must be coprime"
如果模是复合的,只要x和m是互质,该算法仍然有效。如果它们共享一个因子,则逆不存在。如果gcd不是1,则没有模逆。右上方:
模m的乘法逆存在的充要条件是a和m是互质(即gcd(a,m)=1)
当你试图计算这个商的模p(对于某个素数),让我假设你知道结果是一个整数 正如人们提到的,如果q>=p,那么你不能计算分母的倒数,如q!不是模的互质,所以这个数是不可逆的。但这并不意味着你不能计算整商的模p 设a,b分别是分子和分母中p因子的个数。由于结果是一个整数,我们有a>=b。如果不等式是严格的,则结果为0。否则,如果等式成立,我们可以从分子和分母中去掉这些因子,然后继续,因为现在分母是p的互质 让我从有效计算这些a,b数字的方法开始。关键是,对于给定的k,k中p因子的数量!可以这样计算:
int polignac(int k, int p) {
int res = 0, power = p;
while (k >= power) {
res += k/power;
power *= p;
}
return res;
}
这样我们就得到了n的p因子!还有q!,所以求q的p因子是很简单的^r(只需乘以r)
在严格不平等的情况下,我们完成了。如果不是,我们必须计算分子和分母的模,去掉所有的p因子。这也可以有效地解决。我们可以写k!像这样:
int polignac(int k, int p) {
int res = 0, power = p;
while (k >= power) {
res += k/power;
power *= p;
}
return res;
}
k!=1 x 2 x 3 x。。。x(p+1)x(p+2)。。。x(p^2)x
如果我们去除p因子并应用模,我们得到以下结果:
k!=1 x 2 x 3 x。。。x(这里什么都没有,只是一个1)x1x2。。。x(另一个1)x
因此,相同的产品一直重复到最后。所以计算1 x 2 x。。。x(p-1)模p,将其提升到适当的幂模p(使用快速幂运算),然后将其乘以“reamaining”项,因为通常k不能被p整除 这是什么语言?它不能同时是Java和C。扩展的欧几里德算法。谷歌吧!