求n个数的gcd最快的方法是什么?
计算n个数字的最大公约数的最快方法是什么?
what is the fastest way to compute the greatest common divisor of n numbers?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
计算n个数字的最大公约数的最快方法是什么?
what is the fastest way to compute the greatest common divisor of n numbers?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(15)
不使用递归:
对于非常大的数组,使用 fork-join 模式可能会更快,在该模式中,您可以分割数组并并行计算 gcd。这是一些伪代码:
Without recursion:
For very large arrays, it might be faster to use the fork-join pattern, where you split your array and calculate gcds in parallel. Here is some pseudocode:
您可能需要先对数字进行排序,然后从最小的两个数字开始递归计算 gcd。
You may want to sort the numbers first and compute the gcd recursively starting from the smallest two numbers.
C++17
我编写了这个函数,通过使用 C++ 内置的
__gcd(int a, int b)
函数来计算 n 个数字的 gcd。要了解有关此功能的更多信息,请访问此链接。
另请参阅 Dijkstra 的 GCD 算法以下链接。它无需分割即可工作。所以它可能会稍微快一些(如果我错了,请纠正我。)
C++17
I have written this function for calculating gcd of n numbers by using C++'s inbuilt
__gcd(int a, int b)
function.To know more about this function visit this link .
Also refer to Dijkstra's GCD algorithm from the following link. It works without division. So it could be slightly faster (Please correct me if I am wrong.)
您应该使用 Lehmer 的 GCD 算法。
You should use Lehmer's GCD algorithm.
下面通过减法使用欧几里得算法怎么样:
上述实现需要 O(n^2) 时间。有改进可以实现,但我没有尝试这些出n个数。
How about the following using Euclidean algorithm by subtraction:
The above implementation takes O(n^2) time. There are improvements that can be implemented but I didn't get around trying these out for n numbers.
如果您有很多小数字,因式分解实际上可能会更快。
(适用于一些示例,但未经真正测试)
If you have a lot of small numbers, factorization may be actually faster.
(works for some examples, but not really tested)
使用欧几里德算法:
将其应用于前两个数字,然后应用第三个数字的结果,依此类推...:
Use the Euclidean algorithm :
You apply it for the first two numbers, then the result with the third number, etc... :
下面是使用数组查找 N 个数字的 HCF 的 C 程序的源代码。
有关更多信息,请参阅此网站以获取进一步说明…………
Here below is the source code of the C program to find HCF of N numbers using Arrays.
For more refer to this website for further clarification.......
您可以使用分而治之的方法。要计算 gcdN([]),请将列表分为前半部分和后半部分。如果每个列表只有一个数字。您可以使用 gcd2(n1, n2) 进行计算。
我刚刚写了一个快速示例代码。 (假设列表中的所有 num 都是正整数)
You can use divide and conquer. To calculate gcdN([]), you divide the list into first half and second half. if it only has one num for each list. you calculate using gcd2(n1, n2).
I just wrote a quick sample code. (assuming all num in the list are positive Ints)
这是一个 gcd 方法,它使用 gcd(a, b, c) = gcd(a, gcd(b, c)) 的属性。
它使用 BigInteger 的 gcd 方法,因为它已经过优化。
Here's a gcd method that uses the property that gcd(a, b, c) = gcd(a, gcd(b, c)).
It uses BigInteger's gcd method since it is already optimized.
**
**
**
**
一种适用于任意位数的递归 JavaScript (ES6) 单行代码。
A recursive JavaScript (ES6) one-liner for any number of digits.
这就是我在 Javascript 中想到的。
This is what comes off the top of my head in Javascript.
这就是我一直在寻找的答案。
找到n个数的gcd的最佳方法确实是使用递归。即gcd(a,b,c)=gcd(gcd(a,b),c)。但当我这样做时,我在某些程序中遇到了超时。
这里需要的优化是应该使用快速矩阵乘法算法来解决递归。
Here was the answer I was looking for.
The best way to find the gcd of n numbers is indeed using recursion.ie gcd(a,b,c)=gcd(gcd(a,b),c). But I was getting timeouts in certain programs when I did this.
The optimization that was needed here was that the recursion should be solved using fast matrix multiplication algorithm.