计算乘法为完美平方的所有可能对的有效算法[关闭]

Posted

技术标签:

【中文标题】计算乘法为完美平方的所有可能对的有效算法[关闭]【英文标题】:Efficient algorithm to calculate all possible pair whose multiplication is a perfect quare [closed] 【发布时间】:2015-01-28 03:06:21 【问题描述】:

我有两个数字 N 和 M。 我想有效地计算有多少对 a,b 使得 1

我知道计算这个的明显 N*M 算法。但我想要比这更好的东西。 感谢您提前提供任何帮助。伪代码会更有帮助。

编辑:我认为它可以在更好的时间完成,可能是 O(m+n) 或类似的东西,但直接从以前的对计算新的对,而不是遍历所有 a 和 b。

【问题讨论】:

我是否遗漏了什么,或者答案显然不只是取 1, 2, ..., N 和 1, 2, ..., M 的交集,然后将结果的每个成员配对与自己? @iShouldUseAName: 2*8 == 16 @iShouldUseAName 一个快速反例:N=5,M=10。然后 (4,9) 有效,因为 4*9 = 36 = 6²。 这个问题没有什么太宽泛的。它要求解决类似于例如的具体问题的解决方案。欧拉计划。我看不到任何好的算法,但也许其他人可以。 【参考方案1】:

我的方法是这样的:

    s 是方格,s <= N*M

      s进行素数分解。

      遍历这个素数分解的分区并检查哪些分区满足您的要求

遍历可能的分区可能有点棘手,但我很确定这是可能的最有效的方法。

另一方面,迭代平方数是微不足道的:

for(int i = 0, square = 0; /*whatever*/; square += 2*i++ + 1)

【讨论】:

【参考方案2】:

我会选择一种使用素数分解的方法。 获取 1 到 max(N,M) 之间的所有质数,我们称它们为 (p0, p1, ... pn)

那么任何数 a

那么,任何乘积 a*b 都可以写成,而在这种写法中,完美正方形的特征是所有 (ai+bi) 都必须是偶数(0 是偶数,为了记录)。

然后您需要以某种方式迭代所有 (ai) 使得 a

不确定这是否接近高效,但应该可以正常工作。

【讨论】:

以上是关于计算乘法为完美平方的所有可能对的有效算法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

哈希算法的未来

找到单个数字的最大完美平方的最快函数?

计算机快速计算,2^N是如何实现的?

完美平方算法 - 实现解释

机器学习算法概述第五章——CART算法

为 ARM Thumb2 寻找有效的整数平方根算法