Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php web中的长数操作_Php_Javascript_Perl_Math - Fatal编程技术网

Php web中的长数操作

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

我想写(而不是使用现有的)一个能处理长数字(我指的是至少几百位数字)的库(或其他东西)

第一个问题:为它选择一种语言。哪一个更好:Perl/JavaScript/PHP

第二个问题:如何实现长数字操作?我唯一能做的就是像处理阵列一样处理它们,例如:

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的补码可能更简单,但对于任意大小的数字,符号大小可能更简单

我不确定您是想编写一个用于处理长数字(例如,用于计算素数或其他)的高级库,还是只是为了学习而实现低级操作(加法、乘法)。如果你对前者感兴趣,你应该考虑Python而不是JavaScript /PHP/Perl。Python在其标准库中内置了对任意大整数的支持和对精确浮点运算的十进制类。

不使用现有库
超出了问题的范围。使用字符串表示。不,没有神奇的移位位方法。这将是缓慢的。如果速度是一个问题,那么这是一种有缺陷的实现方法。@mario您能告诉我更多关于将数字表示为字符串的信息吗?我应该拆分字符串,进行一些操作并连接它们吗?如果能给我一个小例子,我将不胜感激。@ted如果您将数字表示为字符串而不是数组,那将更好。因为它会更容易阅读。而不是
数组(12,90)
“1290”
将更具可读性。你们也在通过引用把参数传递给函数,因为它会大大提高速度;所以,我将数字保留为十进制,它们是“小尾数”,我还为每个数组的单元格放置了4位数字(我认为这会稍微提高性能),不需要浮点数,我更喜欢符号大小。现在我遇到了longnumber_模块(
%
我的意思是)实现的问题;当我尝试这样做时,它非常慢,比如:数-系数*mod,其中系数=(近似)数/mod;我也不知道如何生成长素数。我想拉宾-米勒测试不是最好的决定吧?有没有什么方法可以让我和你交流以获得一些提示(可能是你的博客?)。谢谢你。@ted Oops,我想我已经回答了这个问题。。。我总是将模/余数和除法组合成一个函数,因为在除法时很容易跟踪余数。然后除法函数只返回商。Rabin miller应该适合测试/生成素数。如果你愿意,你可以给我发电子邮件(或者在这里问一些具体问题)。我的网站上有一个联系方式:。如果能在你的博客上看到部门(以及模块的一部分),那就太好了。说实话,我应该很有“天赋”,因为你的O(n^2)乘法比我实现的Kurutsuba longnumber乘法要快。@ted是的,我正打算写除法,但我还没来得及写。实际上,我在乘法方面也遇到了同样的问题,这就是为什么我使用O(n^2)算法(至少现在是这样,我以后可能会重新计算)。增加每个单元格中的位数可能会有所帮助。您最多可以达到7位,而不会遇到精度问题。