计算x ^ 2的算法或计算数字的平方根的算法更有效?

时间:2019-08-28 13:01:19

标签: algorithm root square

计算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

2 个答案:

答案 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 = 0x = 1。由于多项式的导数2x - 1对于两个解都是非零模2和模5,因此Hensel's lemma表示01是实际上,唯一的解决方案是发挥主力。

因此,有四个解mod 10^k,其残基为01 mod 2^k5^k。例如,376 mod 5^3 = 1376 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行。