1
9
这样想,如果你有一个正整数
我不知道哈斯克尔,但这个F应该很容易转换:
保证为O(对数N)。易于修改完美的立方体和更高的功率。 |
2
8
有一个
精彩的
哈斯凯尔大多数数论相关问题的图书馆
使用
特别是
图书馆是经过优化和审查的,比你或我更加注重效率。虽然它目前还没有 this kind of shenanigans 在这种情况下,随着图书馆的发展,它将来可能会变得更加优化。 View the source code 了解它是如何工作的! 不要重新发明轮子,只要有图书馆就一定要用。 |
3
5
我认为您提供的代码是最快的:
此代码的复杂性是:一个sqrt、一个双乘法、一个cast(dbl->int)和一个比较。您可以尝试使用其他计算方法来用整数算术和移位替换sqrt和乘法,但很可能它不会比一个sqrt和一个乘法更快。 唯一值得使用另一种方法的地方是,您运行的CPU是否不支持浮点运算。在这种情况下,编译器可能必须在软件中生成sqrt和double-multiplex,并且您可以在优化特定应用程序时获得优势。 正如其他答案所指出的,大整数仍然有一个限制,但是除非你要碰到这些数字,否则利用浮点硬件支持可能比编写自己的算法更好。 |
4
1
维基百科 article on Integer Square Roots HAS算法可以根据您的需要进行调整。牛顿的方法很好,因为它是四次收敛的,也就是说,每一步得到两倍的正确数字。
我建议你远离
|
5
1
哦,今天我需要确定一个数是否是完美的立方体,类似的解非常慢。 所以,我想出了一个非常聪明的选择
很简单。我想,我需要使用一个树来更快地查找,但是现在我将尝试这个解决方案,也许它对于我的任务来说足够快。如果没有,我将用适当的数据结构编辑答案。 |
6
1
有时候你不应该把问题分成太小的部分(比如支票)
|
7
1
有一个非常简单的方法来测试一个完美的平方-相当准确地说,你要检查这个数字的平方根在小数部分是否有除零以外的任何东西。
|
8
1
在对这个问题的另一个答案的评论中,您讨论了memoization。请记住,这项技术有助于当您的探针模式显示出良好的密度。在这种情况下,这意味着反复测试相同的整数。您的代码重复相同的工作从而从缓存答案中获益的可能性有多大? 您没有告诉我们您输入的分布情况,因此考虑使用卓越的快速基准 criteria package:。 模块主 在哪里? 导入标准.main 随机进口 方格n=sq*sq==n 其中sq=楼层$sqrt$(来自整数n::double) ISS-平方平方米 检查n=sq*sq==n 其中sq=楼层$sqrt$(来自整数n::double) 在(地图检查[0….]!!) 主=做 G<-新闻tdgen 设rs=取10000$randomrs(01000::int)g 直接=地图为正方形 memo=地图是正方形 默认主[工作台“直接”$WHNF直接 ,工作台“备忘录”$WHNF备忘录RS ] < /代码>此工作负载可能代表您正在做的工作,也可能不代表您正在做的工作,但正如所写,缓存未命中率似乎过高: . 请记住,这项技术有助于当您的探针模式显示出良好的密度。在这种情况下,这意味着反复测试相同的整数。您的代码重复相同的工作从而从缓存答案中获益的可能性有多大?
您没有告诉我们您输入的分布情况,因此请考虑使用 criterion 包裹:
此工作负载可能代表您正在做的工作,也可能不代表您正在做的工作,但正如所写,缓存未命中率似乎过高:
|
9
0
它不是特别漂亮,也不是很快,但是这里有一个基于牛顿方法的无铸,无fpa的版本,它可以(缓慢)处理任意大的整数:
它可能会被一些额外的数论诡计加速。 |