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。你不知道先验搜索有多远,所以可以使用分段筛。