[英]What is the fastest way to represent number as the sum of powers of two in python
[英]Split up a number as the sum of two powers
x是我的输入。 我需要找到i,j> = 0和n,m> 1,例如x = i**m+j**n
现在我一直这样做,但它是慢慢的方式! 我怎样才能改进它?
from math import sqrt
import numpy as np
def check(x):
for i in range(1,int(np.ceil(sqrt(x)))):
for j in range(1,int(np.ceil(sqrt(x)))):
for m in range(2,x/2+1):
for n in range(2,x/2+1):
if((pow(i,m) +pow(j,n))==x):
print 'Yes';
return ;
print 'No';
谢谢 !
您可以通过查找小于x的所有幂(i ** m)来反转该过程。 然后你只需要检查这些功能是否与x相加。
def check(x):
all_powers = set([1]) #add 1 as a special case
#find all powers smaller than x
for base in range(2,int(math.ceil(sqrt(x)))):
exponent = 2;
while pow(base, exponent) < x:
all_powers.add(pow(base, exponent))
exponent+=1
#check if a pair of elements in all_powers adds up to x
for power in all_powers:
if (x - power) in all_powers:
print 'Yes'
return
print 'No'
上面的代码很简单,但可以进行优化,例如,通过集成检查,如果一对在while循环中加起来x,您可以在大多数情况下提前停止。
这里会不时出现一个问题,即确定正整数是否是另一个正整数的积分幂。 即给定正整数z
找到正整数j
和n
,使得z == j**n
。 这可以在时间复杂度O(log(z))
因此它相当快。
所以找到或开发这样一个例程:如果z
不是(0, 0)
则调用is_a_power(z)
返回一个元组(j, n)
。 然后循环i
和m
,然后检查x - i**m
是否为幂。 当它成为一体时,你就完成了。
我会让你从这里完成代码,除了一个指针。 给定x
和i
,其中i > 1
,你可以找到m
上限,使得i**m <= x
with
m <= log(x) / log(i)
请注意, i == 1
是一种特殊情况,因为在这种情况下i**m
实际上并不依赖于m
。
from math import sqrt
import numpy as np
def build(x):
# this function creates number that are in form of
# a^b such that a^b <= x and b>1
sq=sqrt(x);
dict[1]:1; # 1 is always obtainable
dict[0]:1; # also 0 is always obtainable
for i in range(1,sq): # try the base
number=i*i; # firstly our number is i^2
while number<=x:
dict[number]:1; # this number is in form of a^b
number*=i; # increase power of the number
def check(x):
sq=sqrt(x);
for i in range(1,sq): # we will try base of the first number
firstnumber=1;
while firstnumber<=x: # we are trying powers of i
remaining=x-firstnumber; # this number is remaining number when we substract firstnumber from x
if dict[remaining]==1: # if remaining number is in dictionary which means it is representable as a^b
print("YES"); # then print YES
return ;
firstnumber*=i; # increase the power of the base
print("NO");
return ;
上面的代码在O(sqrt(x)* log(x)* log(x))中工作,这更快。
您可以阅读代码中的注释以了解它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.