当前位置: 首页 > 知识库问答 >
问题:

求给定数以下2个素数的最大乘积

裴永年
2023-03-14

给定一个数N,我们如何求最大P*Q

    null
√N = 5.196

Candidate primes: 2,3,5 --> [{2,13.5},{3,9},{5,5.4}] ->[{2,13},{3,7},{5,5}]

Solution: Max([2*13, 3*7, 5*5]) = 2*13 = 26

因此,暴力解决方案起作用。

再进一步,我们看到Q_max<=n/2,如果我们确实同意P =√n。

我们可以将我们的解决方案集细化为仅有那些值{P,n\2},其中n\2>=√N。

√N = 5.196

Candidate P: 2,3 --> [{2,13},{3,9}] -->[{2,13},{3,7}]

(we drop {5,5} since N\P < √N i.e. 5 < 5.196)

Solution set: max([2*13, 3*7]) = 2*13 = 26

这可能看起来微不足道,但它只是消除了可能的解决方案集的1/3。

我们是否可以添加其他聪明的程序来进一步减少设置?

共有1个答案

强保臣
2023-03-14

这与@RalphmRickenback描述的类似,但具有更严格的复杂性界限。

他描述的素数查找算法是Erathostenes的筛子,需要空间O(n),但时间复杂度为O(n log log n),如果你想对此更加小心,你可能想看看维基百科上的讨论。

在找到一个小于n//2的素数列表后,您可以通过将一个指针开始在开头,另一个指针结束来扫描它一次,即复杂度为O(n)。如果这两个素数的乘积大于你的值,减小高指针。如果乘积较小,则将其与存储的最大乘积进行比较,并增加低指针。

这里是Python的完整实现,而不是伪代码:

def prime_sieve(n):
    sieve = [False, False] + [True] * (n - 1)

    for num, is_prime in enumerate(sieve):
        if num * num > n:
            break
        if not is_prime:
            continue
        for not_a_prime in range(num * num, n + 1, num):
            sieve[not_a_prime] = False

    return [num for num, is_prime in enumerate(sieve) if is_prime]

def max_prime_product(n):
    primes = prime_sieve(n // 2)

    lo, hi = 0, len(primes) - 1
    max_prod = 0
    max_pair = None

    while lo <= hi:
        prod = primes[lo] * primes[hi]
        if prod <= n:
            if prod > max_prod:
                max_prod = prod
                max_pair = (primes[lo], primes[hi])
            lo += 1
        else:
            hi -= 1
    return max_prod, max_pair

在您的示例中,这将产生:

>>> max_prime_product(27)
(26, (2, 13))
 类似资料:
  • 形成N的非素数对是2个不同的非素数,其中数的乘积是N。 1<=n<=10^6

  • 本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1

  • 我的问题很简单,但我不知道如何解决我想要的。我必须找到小于给定数字的最大数素数,如果不存在则打印消息。 代码是有效的,如果数字是10,它会打印7,但我想做2个新的修改,我找不到解决方案。例如,如果给定的数字是1,我的程序应该如何修改以打印消息?我试着写一个if-else,但是如果我用if修改了while,这将不会有帮助。第二件事,如果给定的数是素数,代码仍然会找到比给定数少的数。如果我给数字7,输

  • O(n^2)算法简单。有没有人对此有更好的算法?

  • 我想找到一组素数的最小集合,它可以和一个给定的值,例如9=7+2(而不是3+3+3)。 我已经使用eratosthens筛生成了一个数组素数 我正在按降序遍历数组,以获得数组中小于或等于给定数的最大素数。如果数字是奇数,这很有效。但对于偶数(例如122=113+7+2,但122=109+13)则失败。