Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm_Numbers - Fatal编程技术网

Python 如何从某个数中确定分子和幂?

Python 如何从某个数中确定分子和幂?,python,algorithm,numbers,Python,Algorithm,Numbers,我如何发现或找出哪个/什么数字可以作为分子和某个数字的幂,例如: # finds base and power where base**power == N def basePower(N): base,power = (N,1) if N>=0 else basePower(-N) if N<1: return (-base,power) if power%2 else (N,1) maxPower = N.bit_length() fo

我如何发现或找出哪个/什么数字可以作为分子和某个数字的幂,例如:

# finds base and power where base**power == N    
def basePower(N):
    base,power = (N,1) if N>=0 else basePower(-N)
    if N<1: return (-base,power) if power%2 else (N,1)
    maxPower   = N.bit_length()
    for p in reversed(quickPrimes(maxPower)):
        if p>maxPower: continue
        root = intRoot(base,p)
        while root:  # prime factorisation of exponents
            maxPower = maxPower//p + 1
            base,power = root,power*p 
            root = intRoot(base,p)
    return base,power
8是初始/特定数字,但被拆分为2,并提升为3的幂,其中:

8=2^3, 81=3^4.

是否有任何类型的软件/算法可以为这个问题提供答案?例如64?

您可以通过迭代幂并找到生成整数的最高第n个根来实现

2 is the numerator and 3 is the power
庞大数字的解决方案

def quickPrimes(N):
    isPrime = [False,True]*(N//2+1)
    primes  = [2]
    for p in range(3,N+1,2):
        if not isPrime[p]: continue
        primes.append(p)
        isPrime[p*p:N+1:p] = (False for _ in range(p*p,N+1,p))
    return primes
[EDIT2]使用素因子分解的更好解决方案:

您可以找到素数因子并获取素数计数的最大公分母(gcd)

例如,216000的素数因子是2^6,3^3,5^3,因此幂为3。对于每个素数,保持count/3作为计算基数的幂:2^2*3^1*5^1=60。所以216000=60^3

basePower(1522756**5553) # (1234, 11106) in 46  seconds, 34,333 digits
basePower(12345**12345)  # (12345,12345) in 159 seconds, 50,510 digits

可以通过对幂进行迭代并找到生成整数的最高第n个根来实现

2 is the numerator and 3 is the power
庞大数字的解决方案

def quickPrimes(N):
    isPrime = [False,True]*(N//2+1)
    primes  = [2]
    for p in range(3,N+1,2):
        if not isPrime[p]: continue
        primes.append(p)
        isPrime[p*p:N+1:p] = (False for _ in range(p*p,N+1,p))
    return primes
[EDIT2]使用素因子分解的更好解决方案:

您可以找到素数因子并获取素数计数的最大公分母(gcd)

例如,216000的素数因子是2^6,3^3,5^3,因此幂为3。对于每个素数,保持count/3作为计算基数的幂:2^2*3^1*5^1=60。所以216000=60^3

basePower(1522756**5553) # (1234, 11106) in 46  seconds, 34,333 digits
basePower(12345**12345)  # (12345,12345) in 159 seconds, 50,510 digits

素因子分解将为您提供预期的结果。演示:

    findPower(12345**12345))     # (12345,12345) in 2.8 seconds

素因子分解将为您提供预期的结果。演示:

    findPower(12345**12345))     # (12345,12345) in 2.8 seconds

这看起来像素因子分解。您可以在上找到更多信息。基本上不存在已知的直接算法,因此一个简单的方法是使用从埃拉托斯坦筛到sqrt(n)的试算法。检查这个,完全相同的问题:@abinhav它不提供任何sort@serge我不明白你提到的备选方案,@serge已经指出了答案。谢天谢地,对于一个由两个非常大的素数相乘得到的数,没有这样的方法。。。否则,运行于现代世界的某些加密方法将受到黑客攻击。同样,问题也不清楚分子是否必须是最小的可能数字。一个非常简单的例子,如果数字是10000,你怎么知道它是10^4或100^2?这看起来像素因子分解。您可以在上找到更多信息。基本上不存在已知的直接算法,因此一个简单的方法是使用从埃拉托斯坦筛到sqrt(n)的试算法。检查这个,完全相同的问题:@abinhav它不提供任何sort@serge我不明白你提到的备选方案,@serge已经指出了答案。谢天谢地,对于一个由两个非常大的素数相乘得到的数,没有这样的方法。。。否则,运行于现代世界的某些加密方法将受到黑客攻击。同样,问题也不清楚分子是否必须是最小的可能数字。一个非常简单的例子,如果数字是10000,你怎么知道它是10^4或100^2?为什么要演示?可能是为什么它在我的IDE上不起作用?我希望它能有所帮助。如果它不是你想要的,我会删除它…请不要删除@serge。但是我应该如何在IDE上应用代码呢。我不能,这就是为什么我要寻求帮助。@DaveKent我不知道问题出在哪里。上面的代码只包含2个函数的定义(这部分通过一次复制一个函数的定义应该可以正常工作),调用
decomp
两次(这部分包含
>
提示和响应)为什么要演示?可能是为什么它在我的IDE上不起作用?我希望它能有所帮助。如果它不是你想要的,我会删除它…请不要删除@serge。但是我应该如何在IDE上应用代码呢。我不能,这就是为什么我要寻求帮助。@DaveKent我不知道问题出在哪里。上面的代码只包含2个函数的定义(这一部分应该可以通过一次复制一个定义来正常工作),以及调用
decomp
两次(这一部分包含
>
提示和响应)