计算x ^ 2和x ^(1/2)的效率更高的算法是什么? 两者之间最好的是什么更有效? 我要解决的问题是找到第n个“绿色”数字,其中 如果N ^ 2以n结尾,则N是“绿色”数字。例如5 ^ 2 = 25、376 ^ 2 = 141376。 这是我尝试的一些代码,但是要花很多时间才能计算出第十个数字:
我所做的基本上包括取i个x位数获得 如果不对i的最后x个数字求和,则不求和,如果将1与累加器变量相加,则将最后x个数字与i进行比较。我正在考虑以另一种方式来解决这个问题,而不是为每个数字计算i ^ 2,而是计算数字的i ^(1/2)并进行相同的比较,可能会改善程序,因为只需要接受计算以0,1,4,9,6,5结尾的数字。但是我知道真正的改善是伴随而来的 用另一种方式思考问题,而我却丝毫没有想法。
def special_multiply(sa):
reverse_num = reversed(sa)
accumulator = 0
for i, digit in enumerate(reverse_num):
temp_chunk = sa[i:]
temp_pow = "".join(['1', '0' * i])
accumulator += int(digit) * int(temp_chunk) * int(temp_pow)
return accumulator % int("".join(['1', '0' * (i + 1)]))
def green(n):
count = 0
i = 0
while count <= n:
i += 1
si = str(i)
if si == str(special_multiply(si)):
count += 1
return i
答案 0 :(得分:3)
以另一种方式,如果k
位数字x
满足,则为绿色
2 k
x = x mod 10 .
Chinese remainder theorem暗示该方程式等于两个方程式
2 k
x = x mod 2
2 k
x = x mod 5 .
求解这些方程式等效于以x^2 - x = x (x - 1)
或2
的幂为模,找到多项式5
的根。 Mod 2
和Mod 5
有两种解决方案,即x = 0
和x = 1
。由于多项式的导数2x - 1
对于两个解都是非零模2
和模5
,因此Hensel's lemma表示0
和1
是实际上,唯一的解决方案是发挥主力。
因此,有四个解mod 10^k
,其残基为0
或1
mod 2^k
和5^k
。例如,376 mod 5^3 = 1
和376 mod 2^3 = 0
。对于每个k
,我们可以使用中文余数定理找到四个解(其中一个为零,因此不合格)。
答案 1 :(得分:0)
首先,计算x ^ 2的算法非常简单-只需计算x * x即可。 假设x〜2 ^ n,则x * x的计算形式为O(n)(2 ^ n可以用n位表示,多路复用为O(1),因为如果我们对n位进行多路复用,则其为O (n))。 相反,x ^(1/2)是相当复杂的计算,包括迭代次数,当然,您实际上需要编写算法而不是x * x行。