Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 逆模问题,其中gcd(分母,mod)=1._Java_C_Algorithm_Math_Data Structures - Fatal编程技术网

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。扩展的欧几里德算法。谷歌吧!