Python 把一个数分成两个幂的和

Python 把一个数分成两个幂的和,python,algorithm,math,optimization,Python,Algorithm,Math,Optimization,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是我的输入。 我需要找到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';

谢谢大家!

这里不时会出现一个问题,关于确定一个正整数是否是另一个正整数的整数幂。即,给定正整数
z
查找正整数
j
n
,从而
z==j**n
。这可以在时间复杂度
O(log(z))
中完成,因此速度相当快

因此,找到或开发这样一个例程:将其称为
is_a_power(z)
,如果
z
(0,0)
的幂,则返回一个元组
(j,n)
。然后在
i
m
上循环,然后检查
x-i**m
是否为电源。当它成为一个,你就完成了


我将让您从这里完成代码,除了一个指针。给定
x
i
其中
i>1
,您可以找到
m
的上限,这样
i**m您就可以通过找到所有小于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'
def检查(x):
所有_powers=set([1])#添加1作为特例
#查找所有小于x的幂
对于范围内的基(2,int(math.ceil(sqrt(x))):
指数=2;
当pow(基准,指数)
上面的代码很简单,但可以进行优化,例如,通过集成while循环中检查一对是否等于x,在大多数情况下,您可以提前停止。

来自math import sqrt
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 ;
将numpy作为np导入 def生成(x): #此函数用于创建以下形式的数字: #a^b使a^b 1 sq=sqrt(x); dict[1]:1;#1总是可以获得的 dict[0]:1;#而且0总是可以获得的 对于范围(1,sq)内的i:#尝试底部 数字=i*i;#首先,我们的号码是i^2
虽然数字这可能不是问这个问题的最佳地方,但你可以做的一件事是,如果值总是超过x,请确保退出循环:如果x是10,并且你有
i=3
,那么在
m>3
时检查任何内容都是毫无意义的,因为它总是大于10,我可以详细说明一下,但请告诉我,如果这是您想要的方向,那么执行
int(np.ceil(x))
的目的是什么?存储
x/2+1
的结果并在m和n次迭代中使用它可能会更快?
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 ;