Python 如何从素数列表中获得不同的因子?

Python 如何从素数列表中获得不同的因子?,python,list,math,sympy,Python,List,Math,Sympy,我一直在尝试(欧拉项目),问题如下: 具有两个不同素数因子的前两个连续数字为: 14 = 2 × 7 15 = 3 × 5 644 = 2² × 7 × 23 645 = 3 × 5 × 43 646 = 2 × 17 × 19. 具有三个不同素数因子的前三个连续数字是: 14 = 2 × 7 15 = 3 × 5 644 = 2² × 7 × 23 645 = 3 × 5 × 43 646 = 2 × 17 × 19. 找到前四个连续整数,每个整数有四个不同的素数因子。第一个数字是多少

我一直在尝试(欧拉项目),问题如下:

具有两个不同素数因子的前两个连续数字为:

14 = 2 × 7
15 = 3 × 5
644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19.
具有三个不同素数因子的前三个连续数字是:

14 = 2 × 7
15 = 3 × 5
644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19.
找到前四个连续整数,每个整数有四个不同的素数因子。第一个数字是多少

以下是我的方法:(您可能需要(pip)安装sympy)

我如何实现因素应该不同的逻辑? 我现在得到的答案(显然是错误的)是:23511 正确答案是:134043

辛素数基本函数:


谢谢

好的,让我们假设你有一个函数,可以给出素数

def find_4_diff(i):
    fact_i = find_factors(i)
    fact_i_plus_1 = find_factors(i+1)
    if all([f_i not in f_i_plus_1 for i in fact_i]):
        fact_i_plus_2 = find_factors(i+2)
        if all([f_i not in f_i_plus_2 for i in fact_i]) and  all([f_i not in f_i_plus_2 for i in fact_i_plus_1]):
            fact_i_plus_3 = find_factors(i+3)
            if all([f_i not in fact_i_plus_3 for i in fact_i]) and  all([f_i not in fact_i_plus_3 for i in fact_i_plus_1]) and all([f_i not in fact_i_plus_3 for i in fact_i_plus_2]):
                return i
    return 


i = 646
myval = find_4_diff(i)
while  myval is None:
    i += 1
    myval = find_4_diff(i)
print(i)
现在,您可以考虑优化的方法: e、 g.您总是至少计算i+1的系数,因此无需再次计算(可以将其作为参数传递),如果系数i+1与系数i+2无效,您可以跳过i+1等


您只需要一个函数,将一个数字的因子返回为数字,例如2到3,返回为8等

def find_4_diff(i):
    fact_i = find_factors(i)
    fact_i_plus_1 = find_factors(i+1)
    if all([f_i not in f_i_plus_1 for i in fact_i]):
        fact_i_plus_2 = find_factors(i+2)
        if all([f_i not in f_i_plus_2 for i in fact_i]) and  all([f_i not in f_i_plus_2 for i in fact_i_plus_1]):
            fact_i_plus_3 = find_factors(i+3)
            if all([f_i not in fact_i_plus_3 for i in fact_i]) and  all([f_i not in fact_i_plus_3 for i in fact_i_plus_1]) and all([f_i not in fact_i_plus_3 for i in fact_i_plus_2]):
                return i
    return 


i = 646
myval = find_4_diff(i)
while  myval is None:
    i += 1
    myval = find_4_diff(i)
print(i)
现在,您可以考虑优化的方法: e、 g.您总是至少计算i+1的系数,因此无需再次计算(可以将其作为参数传递),如果系数i+1与系数i+2无效,您可以跳过i+1等


您所需要的只是一个函数,将一个数字的因子作为数字返回,例如2到3作为8返回等您的
res
是因子的串联,而不是平均除以
i
的4个数字的乘积。不要将c的元素转换为字符串并将它们连接起来,只需尝试从sympy.core.mul import prod导入
prod
中导入
prod
作为
。这样做,
[2,3,5,11]->330而不是
23511


顺便说一句,
len(sympy.factorynt(n))==4
将告诉您
n
是否有4个不同的因子。

您的
res
是因子的串联,而不是4个数平均除以
i
的乘积。不要将c的元素转换为字符串并将它们连接起来,只需尝试从sympy.core.mul import prod导入
prod
中导入
prod
作为
。这样做,
[2,3,5,11]->330而不是
23511


顺便说一句,
len(sympy.factorynt(n))==4
将告诉您
n
是否有4个不同的因子。

wow谢谢,一个小问题是,为什么def中有2个return语句?哦,这是一种使函数停止的方法,如果它没有进入'if'语句,它将返回(在python中返回nothing表示返回None)顺便说一句,你可以删除它,默认返回值是Nonewow谢谢,一个小问题tho,为什么def中有两个return语句?哦,这是一种使函数停止的方法,如果它没有进入if语句,它将返回(在python中return with nothing表示return None),你可以顺便删除它,默认返回是另一个问题,可以通过修改的筛来完成。筛项初始化为零,并包含一个整数,该整数表示该数字的不同素数因子的数目。寻找下一个零条目,它将是下一个素数。将该条目设置为1,然后“筛选”出该质数,在每个条目命中(质数的每个倍数)中添加1。无论何时将条目设置为k,都要向前和向后搜索,查看有多少个连续条目等于k。你不知道要搜索多远,所以可以使用分段筛。这是另一个可以用改进筛来解决的问题。筛项初始化为零,并包含一个整数,该整数表示该数字的不同素数因子的数目。寻找下一个零条目,它将是下一个素数。将该条目设置为1,然后“筛选”出该质数,在每个条目命中(质数的每个倍数)中添加1。无论何时将条目设置为k,都要向前和向后搜索,查看有多少个连续条目等于k。你不知道先验搜索有多远,所以可以使用分段筛。