gpt4 book ai didi

java - 如何有效地找到 p 是质数的 gcd(a,b) % p?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:09:33 25 4
gpt4 key购买 nike

我的方法很简单:

  • 首先,使用 Euclid 算法求 gcd(a,b)
  • 然后用p=10^9+7取出模组

但我需要一种有效的方法(只需要正确的轨道而不是代码):

ab 的值可以在 110^12 之间p 是一个质数 10^9+7

最佳答案

如果我遇到你的问题,这将是我的解决方案。在我的解决方案中,我检查了 long 的范围是否可以满足 10^12。可以看到下面的代码,它给出了18,说明没问题!尽管如此,我还是不喜欢 Euclid 的 GCD,因为它递归地笨拙地工作。您的范围确实很大这一事实会消耗大量内存。所以,我更喜欢 Binary GCD Algorithm .

class Test {
private static final long P = (long)Math.pow(10, 9) + 7;

public static void main(String[] args) {
// Check whether long is suitable in regards to ranges
System.out.println((int)Math.log10(Long.MAX_VALUE));
// Your wish up to 10^12, so it's ok!
int result = calculate(1, (long) Math.pow(10, 12));
System.out.println(result);

result = calculate((long) Math.pow(10, 12), (long) Math.pow(10, 12));
System.out.println(result);
}

public static int calculate(long a, long b) {
return (int)(gcd(a, b) % P);
}

private static long gcd(long p, long q) {
// https://introcs.cs.princeton.edu/java/23recursion/BinaryGCD.java.html
if (q == 0) return p;
if (p == 0) return q;

// p and q even
if ((p & 1) == 0 && (q & 1) == 0) return gcd(p >> 1, q >> 1) << 1;

// p is even, q is odd
else if ((p & 1) == 0) return gcd(p >> 1, q);

// p is odd, q is even
else if ((q & 1) == 0) return gcd(p, q >> 1);

// p and q odd, p >= q
else if (p >= q) return gcd((p-q) >> 1, q);

// p and q odd, p < q
else return gcd(p, (q-p) >> 1);
}

private static long EuclidianGCD(long a, long b) { return b==0 ? a : EuclidianGCD(b, a%b); }

}

您可以查看here 的最后一个答案。 .另外,如果你非要用Euclid的GCD,试试看,可能会卡死!恕我直言,它无论如何都没有效率。

关于java - 如何有效地找到 p 是质数的 gcd(a,b) % p?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51798760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com