用于确定n是否是完美平方的O(log log n)算法

时间:2013-11-10 07:00:02

标签: algorithm numbers big-o time-complexity

是否有任何公布的O(log b)算法来确定b位数是否是整数的平方?

(如果这个问题超出了本网站的范围,我很抱歉,如果是这样,我会很乐意检索它)

更新:我意识到我提出的问题是不合理的。所以让我通过询问b中的子多项式运算的任何算法来修改它。对于常数k,不一定是O(log ^ k b),并且具有“合理的”空间复杂度。操作是按照通常意义定义的:对于手头的任务来说是合理的(例如,添加,否定,xor和/或等)

发布脚本:现在我意识到我的问题是胡说八道。计算n位数的平方根的成本小于两个n位数的乘积。

1 个答案:

答案 0 :(得分:-1)

  1. 如果b足够小,那么使用sqrt表就是复杂性O(1)
  2. 如果没有,则使用位近似是复杂性O(b/2) = O(log n)
  3. 使用完美的方形表也是O(b/2) = O(log n)

    的复杂性

    但操作速度快得多(只比较和位操作)b位数可以是最大b/2位数的正方形,因此表的2^(b/2)条目为{{1}位数和近似索引搜索(类似于二进制搜索)需要b步骤

  4. 可以通过近似来完成一些改进

    创建近似函数b/2并计算y=approx_sqrt(x);现在您只需检查y 中具有运行时< y-c , y+c > 的值{{1} }常数取决于近似精度~T(2c)。大多数近似值都取决于较大的值,因此您可以c并且复杂性突然(1,2,3,...) ,这就是我想要搜索的内容。

  5. <强> [编辑]

    1. 在投票后我发现标记下来隐藏了我文本的一部分

      假设某些格式或c=log(b)的任何格式,所以我添加了一些空格来取消隐藏它,并且还发现子弹#5 错误,所以我将其删除了。如果这是投票失败的原因而不是感谢它我忽略了它......最近正在用素数做点什么......所以我的大脑将它复制到那里而不用深思熟虑

    2. 因为通常没有代码和Wiki页面,你们中有些人不相信并只是投票,所以这里是我上面测试过的实现:

      O(log b) = O(log log n)

      我为你添加了cnt,这样你就可以自己测试复杂性。我使用的大约需要一个良好的起始值,所以我使用的位数减半,显然是< interval >但是对于 bignums //--------------------------------------------------------------------------- int is_square(int x,int &cnt) // return sqrt(x) if perfect or 0, cnt = num of cycles ~ runtime { int y,yy; // y=aprox_sqrt(x) for (y=x,yy=x;yy;y>>=1,yy>>=2); // halves the bit count if (y) y=(y+(x/y))>>1; // babylonian approximation if (y) y=(y+(x/y))>>1; if (y) y=(y+(x/y))>>1; // check estimated y and near values cnt=1; yy=y*y; if (yy==x) return y; if (yy<x) for (;;) { cnt++; y++; yy=y*y; if (yy==x) return y; if (yy> x) return 0; } else for (;;) { cnt++; y--; yy=y*y; if (yy==x) return y; if (yy< x) return 0; } } //--------------------------------------------------------------------------- 值,指数/位数已经是已知的,所以它仅转换为单个位/字/基数/指数移位O(log b)。 BTW即 IEEE浮动魔法floatO(1)函数的大部分近似值完成。

    3. 我的测量结果优于我的第一次估计(即使是非精确的巴比伦近似):

      sqrt

      其中log是测试它的循环/*---------------- | N | T | ------------------ | 1000000000 | 6 | | 100000000 | 4 | | 10000000 | 2 | | 1000000 | 2 | ----------------*/ 。对于不同的近似值({更适合您的需求)N

    4. 所以我对你的问题的回答是它确实存在比N更快的算法,用于确定T是否是完美的正方形(例如我的上面也计算了cnt)但是如果你也在计算基本功能的复杂性,那么我担心答案是 NO ,因为偶数位操作在{bignums上< 0,N > !!!“ p>

      BTW here

      希望它有所帮助。