使用Python查找具有给定算术平均值的一对素数

时间:2015-04-12 09:30:18

标签: python average primes

我必须创建一个函数f(n),它将返回一对具有算术平均值n的素数。例如f(10)= [3,17],f(3)= [3,3]。

到目前为止,我遇到了两个素数同时工作的问题:

def f(n):
    for i in range(2,a):
        for k in range(2,b):
            if a%i!=0 and b%k!=0:
                n=(a+b)/2
                return [a,b]
f(n)

2 个答案:

答案 0 :(得分:1)

首先,让我们创建一个函数来检查数字是否为素数(相当慢):

def is_prime(n):
    for x in range(2, n):
        if n % x == 0:
            return False
    return True

然后我们注意到,对于两个平均n的数字,它们必须具有总和2 * n。也就是其中一个数字,我们说x将低于或等于n。所以现在它很简单:

def f(n):
    for x in range(2, n + 1): # Since smaller will be at most n
        y = 2 * n - x # Since x + y must be 2 * n
        if is_prime(x) and is_prime(y):
            return [x, y]

我们现在可以测试:

>>> f(10)
[3, 17]
>>> f(12)
[5, 19]
>>> f(3)
[3, 3]

答案 1 :(得分:0)

如果我理解正确,程序只需要找到一对素数,所以你肯定要将平均值(n)乘以2,然后找到与它相加的所有整数对,然后检查两者是否都是素数。

用于检查python中素数的强力解决方案是:

def is_prime(n):
    if n==1 or n==0:
        return False
    for i in range(3,n):
        if n%i==0:
            return False
    return True

可以找到其他更快的解决方案here

找到总和为平均时间2的整数对可以通过强力完成(但这会使每对返回两次):

def sums(n):
    return [[x,n-x] for x in range(1,n)]

使用以下两个功能将所有内容放在一起:

def f(n):
    for a in sums(n*2):
        if is_prime(a[0]) and is_prime(a[1]):
            return a
    return 'None found'

希望这有用。