Php web中的长数操作
我想写(而不是使用现有的)一个能处理长数字(我指的是至少几百位数字)的库(或其他东西) 第一个问题:为它选择一种语言。哪一个更好:Perl/JavaScript/PHP 第二个问题:如何实现长数字操作?我唯一能做的就是像处理阵列一样处理它们,例如:Php web中的长数操作,php,javascript,perl,math,Php,Javascript,Perl,Math,我想写(而不是使用现有的)一个能处理长数字(我指的是至少几百位数字)的库(或其他东西) 第一个问题:为它选择一种语言。哪一个更好:Perl/JavaScript/PHP 第二个问题:如何实现长数字操作?我唯一能做的就是像处理阵列一样处理它们,例如: arr1 = (12, 34); //1234 arr2 = (98, 76); //9876 sum = longnumbers_add(arr1, arr2); // + // 34 + 76 = 110 = 10 -..> 1 // 12
arr1 = (12, 34); //1234
arr2 = (98, 76); //9876
sum = longnumbers_add(arr1, arr2); // +
// 34 + 76 = 110 = 10 -..> 1
// 12 + 98 = 110 = 110 + 1 = 11 -..> 1
//sum == (1, 11, 10);
但它的速度很慢(至少在我尝试PHP时是这样)。也许有一些“移位位”的超快速方法
p.S.
我知道有gmp和其他很酷的图书馆
非常感谢您的帮助。您应该试试数学:为了好玩,我写了两个大数字库。就语言而言,我要么选择你最熟悉的语言,要么选择你想了解更多的语言。对我来说,这是最近的JavaScript,但在我看来,这些语言都不太适合大量使用。不过,对于web,很大一部分决策取决于您是想在客户端还是服务器端进行计算。在客户端,JavaScript几乎是唯一的选项 我写了几篇博客文章,展示了基本算法以及我如何选择存储它们。请注意,这些仅适用于大整数(因此没有小数点),但基本原则仍然适用
- 从概念上讲,将数字存储在基数10中可能是最简单的,因为它更为常见,但实际上并不会改变很多实现。不过,更大的基数更有效(在内存和速度方面)
- 将数字保持在“小端”顺序几乎总是比较简单的,因此最低有效位在数组中排在第一位(或者如果使用字符串,则将其反向存储)
- 在工作之前,不要太担心性能。做事情的最快方法有时会让人惊讶,所以你无论如何都会出错,而且一旦你完成了,很容易返回并优化每个操作
- 如果您想支持小数,那么最简单的方法是先编写一个整数类型,然后在此基础上实现浮点数。基本上,您可以将代码分离出来,以跟踪小数点,从而使算法更清晰
- 您需要决定是否要使用(10的补码,或您选择的任何基数的等效值)或符号大小(您将符号与数字分开存储的位置)来处理负数。每种方法在某些领域更复杂,而在其他领域更简单。一般来说,如果大小固定,n的补码可能更简单,但对于任意大小的数字,符号大小可能更简单
不使用现有库
超出了问题的范围。使用字符串表示。不,没有神奇的移位位方法。这将是缓慢的。如果速度是一个问题,那么这是一种有缺陷的实现方法。@mario您能告诉我更多关于将数字表示为字符串的信息吗?我应该拆分字符串,进行一些操作并连接它们吗?如果能给我一个小例子,我将不胜感激。@ted如果您将数字表示为字符串而不是数组,那将更好。因为它会更容易阅读。而不是数组(12,90)
“1290”
将更具可读性。你们也在通过引用把参数传递给函数,因为它会大大提高速度;所以,我将数字保留为十进制,它们是“小尾数”,我还为每个数组的单元格放置了4位数字(我认为这会稍微提高性能),不需要浮点数,我更喜欢符号大小。现在我遇到了longnumber_模块(%
我的意思是)实现的问题;当我尝试这样做时,它非常慢,比如:数-系数*mod,其中系数=(近似)数/mod;我也不知道如何生成长素数。我想拉宾-米勒测试不是最好的决定吧?有没有什么方法可以让我和你交流以获得一些提示(可能是你的博客?)。谢谢你。@ted Oops,我想我已经回答了这个问题。。。我总是将模/余数和除法组合成一个函数,因为在除法时很容易跟踪余数。然后除法函数只返回商。Rabin miller应该适合测试/生成素数。如果你愿意,你可以给我发电子邮件(或者在这里问一些具体问题)。我的网站上有一个联系方式:。如果能在你的博客上看到部门(以及模块的一部分),那就太好了。说实话,我应该很有“天赋”,因为你的O(n^2)乘法比我实现的Kurutsuba longnumber乘法要快。@ted是的,我正打算写除法,但我还没来得及写。实际上,我在乘法方面也遇到了同样的问题,这就是为什么我使用O(n^2)算法(至少现在是这样,我以后可能会重新计算)。增加每个单元格中的位数可能会有所帮助。您最多可以达到7位,而不会遇到精度问题。