优化目标函数

2024-10-02 14:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图最大化Python上的Euler toclient函数,因为它可以使用大量的任意数字。问题是程序在一段时间后被终止,所以它没有达到所需的比率。我想把起始数字增加到一个更大的数字,但我认为这样做不明智。我试着得到一个数,当除以tolient得到大于10时。本质上,我试图找到一个稀疏的、符合这个标准的客户机号码。在

这是我的phi函数:

def phi(n):
    amount = 0

    for k in range(1, n + 1):
        if fractions.gcd(n, k) == 1:
            amount += 1

    return amount

Tags: 函数程序for标准客户机def数字amount
2条回答

p55\。在

此外,所有后续的原始数也是如此,因为pn/phi(pn)是一个严格递增的序列:

p1/phi(p1)为2,为正。对于n>;1,对于n>;1,pnnphi(pnn其)等于pn-1pn/phi(pn-1n-1n,自ppn)的,其,自pnpn-1是互质的,等于(pn-1/phi(pn-1)(pn/phi(pn)。我们知道所有n的phi(pn)>;0,因此pn/phi(pn)>;1。因此我们得到了序列pnphi(pn#)是严格递增的。在

我不相信这些数字是唯一能满足你要求的数字,但我没有一个有效的方法来产生其他的想法。相比之下,生成原语相当于生成前n个素数并将列表相乘(无论是使用函数工具.reduce(), 数学.prod()在3.8+中,或ye old for loop)。在

至于写phi(n)函数的一般问题,我可能会先找到n的素数因子,然后使用Euler的乘积公式来计算phi(n)。另外,请确保不要使用浮点除法。即使通过试除法求n的素数因子,其性能也应优于计算gcd n倍,但当处理大n时,用一个有效的素数因式分解算法来代替这一点会有好处。除非你想要一个好的十字架,否则不要写你自己的。在sympy中有一个我知道,考虑到这个问题的普遍性,可能还有很多其他的问题。需要时间。在

说到时间,如果这对你(或未来的读者)来说仍然有足够的相关性,让你想要时间。。。当然也要把前面的答案也放进去。在

我有一个部分的解决方案给你,但结果看起来不太好。。(这个解决方案可能不能给你一个现代计算机硬件的答案(内存的数量目前是有限的))我从thispcg质询中得到了一个答案,并将其修改为从n/phi(n)到特定n的比率

import numba as nb
import numpy as np
import time

n = int(2**31)

@nb.njit("i4[:](i4[:])", locals=dict(
    n=nb.int32, i=nb.int32, j=nb.int32, q=nb.int32, f=nb.int32))

def summarum(phi):
    #calculate phi(i) for i: 1 - n
    #taken from <a>https://codegolf.stackexchange.com/a/26753/42652</a>
    phi[1] = 1
    i = 2
    while i < n:
        if phi[i] == 0:
            phi[i] = i - 1
            j = 2
            while j * i < n:
                if phi[j] != 0:
                    q = j
                    f = i - 1
                    while q % i == 0:
                        f *= i
                        q //= i
                    phi[i * j] = f * phi[q]
                j += 1
        i += 1
    #divide each by n to get ratio n/phi(n)
    i = 1
    while i < n: #jit compiled while loop is faster than: for i in range(): blah blah blah
        phi[i] = i//phi[i]
        i += 1
    return phi

if __name__ == "__main__":
    s1 = time.time()
    a = summarum(np.zeros(n, np.int32))
    locations = np.where(a >= 10)
    print(len(locations))

我的公司里只有足够的内存。测试约0 < n < 10^8,最大比值约为6。虽然10^8已经花了几秒钟时间(不确定开销是多少…),但是你可能没有任何运气去达到更大的n。。。斯派德最近表现得很奇怪)

相关问题 更多 >