Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用最简单的python方法查找数字的因子_Python_Python 3.x - Fatal编程技术网

如何使用最简单的python方法查找数字的因子

如何使用最简单的python方法查找数字的因子,python,python-3.x,Python,Python 3.x,如何找到一个数字的所有因子并在列表中列出因子 输入: >>>factors(72) 输出: [2, 2, 2, 3, 3] 我已经记下了一些代码,因为这得到了很多视图,这是一个硬件问题,所以我不想复制它 关于你的问题1:。这就是为什么它是许多密码算法的核心,我们目前不知道如何快速计算出一个非常大的数字 对于较小的数字,您的算法就可以了。对于稍大一点的数字,我已经有了——显然,波拉德的Rho算法是一个很好的算法。对于大量的数据,我们不知道 现在谈谈你的问题2: 首

如何找到一个数字的所有因子并在列表中列出因子

输入:

   >>>factors(72)
输出:

   [2, 2, 2, 3, 3]

我已经记下了一些代码,因为这得到了很多视图,这是一个硬件问题,所以我不想复制它

关于你的问题1:。这就是为什么它是许多密码算法的核心,我们目前不知道如何快速计算出一个非常大的数字

对于较小的数字,您的算法就可以了。对于稍大一点的数字,我已经有了——显然,波拉德的Rho算法是一个很好的算法。对于大量的数据,我们不知道

现在谈谈你的问题2:

首先,在primen函数中,不需要一直检查n%i==0到n。您只需要检查sqrtn,因为如果有任何一对整数a,b使得a*b=n,那么这些整数中的一个必然小于或等于sqrtn。因此,您只需要检查sqrtn。这样可以节省大量计算

以下是您的因子函数:

from math import ceil

def factors(n):
        factors = []
        while n > 1:
                for i in range(2,int((ceil(n/2.0))+1)):
                        if n%i==0:
                                factors.append(i)
                                n = n/i
                                continue
                factors.append(n)
                break
        return factors

尽可能快地进行所有的向下表决。

这里有一个使用素数分解的解决方案。速度快得多

import bisect
import math
import pathlib


primes = []
last_prime = None


def _get_primes():
    """
    Load all the primes in global primes. Set global last_prime to last prime
    read.
    """

    global primes
    global last_prime
    path_to_primes = pathlib.Path(__file__).parent \
            .joinpath('../resources/primes.txt')
    with path_to_primes.open() as file:
        for line in file:
            for n in line.split():
                n = n.strip()
                if n:
                    n = int(n)
                    primes.append(n)
    last_prime = primes[-1]


def gen_primes_before(n):
    """
    Generates all the primes before n in reverse order.
    """

    assert n <= last_prime, "Maximum value for n is {}".format(last_prime)
    pos = bisect.bisect_left(primes, n)
    if pos:
        yield from primes[:pos]


def gen_factors(n):
    """
    Generates all the factors of a number. May return some values multiple
    times. Values returned are not ordered.
    """
    type_n = type(n)
    assert type_n is int or (type_n is float and n.is_integer()), "Wrong type"
    n = int(n)
    r = int(math.sqrt(n)) + 1
    assert r <= last_prime, "n is over limit"
    yield 1
    yield n
    for prime in gen_primes_before(r):
        partner = n/prime
        if partner.is_integer():
            yield from gen_factors(prime)
            yield from gen_factors(partner)


def get_factors(n):
    """
    Get all the factors of n as a sorted list.
    """
    return sorted(set(gen_factors(n)))


_get_primes()
if __name__ == '__main__':
    l = (1e9,)
    for n in l:
        print("The factors of {} are {}".format(n, get_factors(n)))

我创建了一个存储库:

什么不起作用?有任何错误消息/异常吗?在运行def factors之后,我得到了这篇阅读材料,请参阅讨论各种快速算法以确定素因式分解。它被标记为C++,但绝大多数是语言不可知论。不,你不需要数学。因为使用了yield,所以它返回一个生成器。尝试listfactors360或任何你想要的输出号码否,在保持循环相同的情况下仍然是相同的
import bisect
import math
import pathlib


primes = []
last_prime = None


def _get_primes():
    """
    Load all the primes in global primes. Set global last_prime to last prime
    read.
    """

    global primes
    global last_prime
    path_to_primes = pathlib.Path(__file__).parent \
            .joinpath('../resources/primes.txt')
    with path_to_primes.open() as file:
        for line in file:
            for n in line.split():
                n = n.strip()
                if n:
                    n = int(n)
                    primes.append(n)
    last_prime = primes[-1]


def gen_primes_before(n):
    """
    Generates all the primes before n in reverse order.
    """

    assert n <= last_prime, "Maximum value for n is {}".format(last_prime)
    pos = bisect.bisect_left(primes, n)
    if pos:
        yield from primes[:pos]


def gen_factors(n):
    """
    Generates all the factors of a number. May return some values multiple
    times. Values returned are not ordered.
    """
    type_n = type(n)
    assert type_n is int or (type_n is float and n.is_integer()), "Wrong type"
    n = int(n)
    r = int(math.sqrt(n)) + 1
    assert r <= last_prime, "n is over limit"
    yield 1
    yield n
    for prime in gen_primes_before(r):
        partner = n/prime
        if partner.is_integer():
            yield from gen_factors(prime)
            yield from gen_factors(partner)


def get_factors(n):
    """
    Get all the factors of n as a sorted list.
    """
    return sorted(set(gen_factors(n)))


_get_primes()
if __name__ == '__main__':
    l = (1e9,)
    for n in l:
        print("The factors of {} are {}".format(n, get_factors(n)))