Python 递归计算集合成员的GCD

Python 递归计算集合成员的GCD,python,algorithm,greatest-common-divisor,Python,Algorithm,Greatest Common Divisor,我们有一组正整数 我们通过计算这个集合中所有可能的整数对的最大公约数来创建一个新集合 我们重复上述步骤,直到集合中只剩下一个成员 是否有On方法来计算此过程创建了多少个新集合,以及最后一个集合中的成员是否为1 一些python代码演示了我描述的过程 from itertools import combinations from fractions import gcd import random def gen_new_set(a): count = 0 while len(a

我们有一组正整数

我们通过计算这个集合中所有可能的整数对的最大公约数来创建一个新集合

我们重复上述步骤,直到集合中只剩下一个成员

是否有On方法来计算此过程创建了多少个新集合,以及最后一个集合中的成员是否为1

一些python代码演示了我描述的过程

from itertools import combinations
from fractions import gcd
import random

def gen_new_set(a):
    count = 0
    while len(a) != 0:
       print str(count)+':\t'+str(len(a))+'\t'+str(a)
       a = set(gcd(x[0], x[1]) for x in combinations(a,2))  
       count += 1

if __name__ == '__main__':
    a = set( random.sample(range(1,40), 10))
    gen_new_set(a)
不。在第一次迭代中有On*n对,它们中的任何一个都可能有一个在别处共享的共同素因子。因此,一般来说,这是一个关于*n的必要工作量,用来判断集的数量是1还是2

当然,有一个On算法可以找到整个集合的GCD,它会告诉你整个集合是否为1

现在,当你说整数时,一个任意的整数可能很难分解一个密码学非常利用的事实。但是如果整数的大小合理,那么因子分解实际上是一个相当有效的操作,每个整数只有很少的素因子。因此,作为预处理步骤,您可以存储数字与其因式分解的关系。然后制作一个哈希表,将每个素数p映射到它所除的数。现在简单地遍历素数,对于每一个素数,我们都会把它的一个子集除掉,然后递归地对那个素数进行计算


这个算法应该类似于*k+n*s,其中n是整数的数量,k是分解它们的平均成本,s是生成的子集的数量。对于位n和小整数,这比执行您描述的操作更有效。

我认为不可能在恒定时间内实现这一点。您可能需要迭代第一个集合的内容以进行泛化,这将使您至少处于On.whoops状态。我是说继续。我会编辑它。你从n个数字开始,然后计算每一对可能的GCD。在此之后,将有n^2个值,可能有许多重复项。我看不到任何方法可以从数学上证明,在这组n^2的值中,最多可以有c个不同的值,其中c是一个常量。除非能证明这一点,否则在第一步之后,你会有k*n个数,其中k可能是一个分数,这可以给你最好的Onlogn解。因此,不可能有一个统一的解决方案。