从math import ceil from fractions import gcd from numpy import searchsorted from itertools import combinations 所有无序数对(mod 2),根据a^3+b^3(mod 2)的值划分为集合。 第一位=[[(0,0),(1,1)],[(0,1) ]] def taxicab(N): “ 返回所有小于N的taxicab数字。 基本算法是枚举所有对数字a,b<立方根(N), 在散列映射中保持a^3+b^3,并返回与多个对对应的所有值。 这有O(N^(2/3))的时间和范围复杂性。 我们在这方面做得再好不过了时间-我们必须检查所有的数字对直到 N^(1/3)。但是对于空间,我们可以构造一对数字(a,b)“一位一位”。在每个阶段,数字被定义(mod 2^bit),并且根据a^3+b^3(mod 2^bit)的值将这些对划分成集合。一个出租车号码只能由同一个集合中的两个对来定义,这样我们就可以找到由set 设置的出租车号码(以类似DFS的方式),而不必将所有集合保存在内存中。一旦我们把数字构造到所需的位,我们就可以用通常的方法找到出租车号码。平均来说,每组的大小是它的两倍-有4倍多的对,但它们被分成2组。我们得到了O(N^(1/3))。N的最佳值是2^(3k)-其他值在复杂度方面是微不足道的。 “ up_-bit=N_位(int(ceil(N**(1/3))-1) result=[] 对于第一个_位的pair u集: 从_集(pair_set,2,up_to_bit,result) result.sort() #算法给我们的出租车号大于N,但它们有间隙。 return result[:searchsorted(result,N) def complete_from_set(pair_set,bit,up_to_bit,result): ”“将“pair_set”可以生成的所有出租车编号添加到“result”中。”若 若 将_ u u u 将u u答:,b) 并返回所有可能的(n+1)位数对,其中(a,b)为n个低位。“以a^3+b^3(MOD2 ^(bit+1)为基础,以a^3+b^3(mod 2 ^(bit+1)为基础,将 以 以 加十十^ 3在,[])+[next_pair] return cube_dict.itervalues() def four_next_pairs(pair,add): ”“返回添加到x、y、nether或both中的由'add'组成的对。”“”x,y=pair #结果和每对将按大小排序。 result=[(x,y),(x,y+add)] 这确保我们不会有重复的对。 如果x!=y: result.append((y,x+add)) result.append((x+add,y+add)) return result def all_taxicab_from_set(pair_set): “返回由pair_集中的两个对定义的所有出租车编号。”cube_sum_dict={} 对于pair中的pair n=cube_sum(*pair) cube_sum_dict.get(n,[])+[pair] return(cube_sum for cube_sum,立方公积中的成对数据_sumdict.iteritems();如果len(pairs)>1且所有UCopPrime U成对(pairs)(pairs)起 除除除除除外无其他任何u优优优优u对对(对): gcds=(gcd(*pair)对成对成对成对成对成对成对成对(gcds,2)除除除除除除除除除外)除除除除除n外无外无u比特(n)外)=1 def n _比特(n): 返回n的位数外,除以下外,”“除除除外,外,外,除除除外,外,其余外,除10起起起起除除除外,外,除除 n=n>>1 返回位 def cube_sum(a,b): 返回a**3+b**3