是否有任何公布的O(log b)算法来确定b位数是否是整数的平方?
(如果这个问题超出了本网站的范围,我很抱歉,如果是这样,我会很乐意检索它)
更新:我意识到我提出的问题是不合理的。所以让我通过询问b中的子多项式运算的任何算法来修改它。对于常数k,不一定是O(log ^ k b),并且具有“合理的”空间复杂度。操作是按照通常意义定义的:对于手头的任务来说是合理的(例如,添加,否定,xor和/或等)
发布脚本:现在我意识到我的问题是胡说八道。计算n位数的平方根的成本小于两个n位数的乘积。
答案 0 :(得分:-1)
b
足够小,那么使用sqrt
表就是复杂性O(1)
O(b/2) = O(log n)
使用完美的方形表也是O(b/2) = O(log n)
但操作速度快得多(只比较和位操作)b
位数可以是最大b/2
位数的正方形,因此表的2^(b/2)
条目为{{1}位数和近似索引搜索(类似于二进制搜索)需要b
步骤
可以通过近似来完成一些改进
创建近似函数b/2
并计算y=approx_sqrt(x);
现在您只需检查y
中具有运行时< y-c , y+c >
的值{{1} }常数取决于近似精度~T(2c)
。大多数近似值都取决于较大的值,因此您可以c
并且复杂性突然(1,2,3,...)
,这就是我想要搜索的内容。
<强> [编辑] 强>
在投票后我发现标记下来隐藏了我文本的一部分
假设某些格式或c=log(b)
的任何格式,所以我添加了一些空格来取消隐藏它,并且还发现子弹#5 错误,所以我将其删除了。如果这是投票失败的原因而不是感谢它我忽略了它......最近正在用素数做点什么......所以我的大脑将它复制到那里而不用深思熟虑
因为通常没有代码和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浮动魔法由float
或O(1)
函数的大部分近似值完成。
我的测量结果优于我的第一次估计(即使是非精确的巴比伦近似):
sqrt
其中log
是测试它的循环/*----------------
| N | T |
------------------
| 1000000000 | 6 |
| 100000000 | 4 |
| 10000000 | 2 |
| 1000000 | 2 |
----------------*/
。对于不同的近似值({更适合您的需求)N
所以我对你的问题的回答是是它确实存在比N
更快的算法,用于确定T
是否是完美的正方形(例如我的上面也计算了cnt
)但是如果你也在计算基本功能的复杂性,那么我担心答案是 NO ,因为偶数位操作在{bignums上< 0,N >
!!!“ p>
BTW here。
希望它有所帮助。