网络中的长号操作

时间:2011-12-11 14:47:50

标签: 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 + 98 = 110 = 110 + 1 = 11 -..> 1
//sum == (1, 11, 10);

但它起作用缓慢(至少我在PHP中尝试)。也许有一些“移位”超快速方法?

P.S。

我知道有gmp和其他很酷的库。

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

为了好玩,我写了几个大数字库。就语言而言,我要么选择你最喜欢的那个,要么选择你想要了解的更多。对我来说,这是最近的JavaScript,但在我看来,这些语言中没有一种或多或少适合大数字。但对于Web来说,决定的很大一部分取决于您是否要在客户端或服务器端进行计算。在客户端,JavaScript几乎是唯一的选择。

我写了几篇博客文章,演示了基本算法以及我如何选择存储它们。请注意,这些仅适用于大整数(因此没有小数点),但仍然适用基础知识。

以下是我的经历中的一些想法:

  • 概念上最简单的方法是将数字存储在基数10中,因为它更为熟悉,但实际上并没有改变很多实现。较大的基数虽然更高效(在内存和速度方面)。
  • 将数字保持为“小端”顺序几乎总是更简单,因此最低有效数字首先出现在数组中(或者如果您使用字符串,则将它们反向存储)。
  • 在你开始工作之前,不要过分担心性能问题。最快的做事方式有时候会令人惊讶,所以无论如何你都会犯错误,一旦完成,很容易回过头来优化每项操作。
  • 如果要支持小数,最简单的方法是首先编写一个整数类型,然后在其上面实现浮点数。基本上,您可以将代码分开以跟踪小数位,以便使算法更清晰。
  • 您需要决定是否要使用two's complement(10的补码,或者您所选择的任何基数的等效物)或符号幅度(您将符号与数字分开存储)处理负数。每种方法在某些方面更复杂,在其他方面更简单。一般来说,如果你有一个固定的大小,n的补码可能更简单,但对于任意大小的数字,符号幅度可能更简单。

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

你应该尝试BCMath:http://php.net/manual/en/book.bc.php