Language agnostic 是不是有一些数学问题;“最佳”;能加速阶乘计算的基数?

Language agnostic 是不是有一些数学问题;“最佳”;能加速阶乘计算的基数?,language-agnostic,integer,biginteger,bignum,factorial,Language Agnostic,Integer,Biginteger,Bignum,Factorial,是否有一些数学上的“最佳”基础可以加速阶乘计算 背景: 只是为了好玩,我正在实现我自己的bignum库。(:这是我的第一个错误吗?:-)。 我正在通过打印n阶乘(n!)的精确值(十进制)来试验内部表示和回归测试中使用的各种基 按照我的bignum库表示整数和乘法的方式,时间与内部表示n!中“1”位的总数成正比!。 在我的内部表示中,使用基数2、4、8、16、2^8、2^30等,对于任何特定的数字,都会给出完全相同的“1”位总数 除非我犯了一些错误,否则以基数18表示的任何给定阶乘(n!)的“1”

是否有一些数学上的“最佳”基础可以加速阶乘计算

背景: 只是为了好玩,我正在实现我自己的bignum库。(:这是我的第一个错误吗?:-)。 我正在通过打印n阶乘(n!)的精确值(十进制)来试验内部表示和回归测试中使用的各种基

按照我的bignum库表示整数和乘法的方式,时间与内部表示n!中“1”位的总数成正比!。 在我的内部表示中,使用基数2、4、8、16、2^8、2^30等,对于任何特定的数字,都会给出完全相同的“1”位总数

除非我犯了一些错误,否则以基数18表示的任何给定阶乘(n!)的“1”位都少于以基数10或16或19表示的相同值。 因此(原则上),使用base 18会使我的bignum库比使用base 10或一些二进制的2^w base或base 19运行得更快。 我认为这与n!在基数18中打印时,比在基数10或基数16或基数19中打印时更短或具有更多的“尾随零”,或两者兼而有之。 是否有其他基地比18基地更有效? 换句话说,, 有代表n的基数吗!比基数18更少的“1”位

这不是“bignum库和素性测试算法的方便基是什么?”的重复,因为我怀疑“处理已知为大阶乘的整数的最佳基,有很多因子为2和3”与“处理没有任何小因子且可能是素数的整数的最佳基数”。 (:是不是在加速阶乘计算——也许是以牺牲其他类型的计算为代价——我的第二个错误?:-)

编辑: 例如:

(decimal) 16! ==
(decimal    ) == 20,922,789,888,000 // uses decimal 14 "1" bits
(dozenal    ) ==  2,41A,B88,000,000 // uses decimal 10 "1" bits
(hexadecimal) ==    130,777,758,000 // uses decimal 18 "1" bits
(octadecimal) ==     5F,8B5,024,000 // uses decimal 14 "1" bits
(我或多或少地将数字存储在右边,没有逗号,加上一些元数据开销)。 (虽然有人可能会认为“随着基数的增加,表示给定数字的“1”位会减少”,或者“随着基数的增加,表示给定数字的非零位会减少”,但上述示例表明,这并不总是正确的。)

我将每个数字存储为一个小整数(“int”或“long int”或“byte”)。有没有其他合理的方法来存储数字? 我很确定我的计算机以二进制形式存储这些整数——每个“1”、“2”、“4”、“8”和“G”数字使用一个“1”位;每个“3”、“5”、“6”、“9”和“A”位使用两个“1”位;每个“7”和“B”数字使用三个“1”位;每个“F”位使用四个“1”位,以此类推

该值的十进制和八进制表示(16!)都需要14“1”位。 所以我在前面的计算中犯了一个错误:每n代表n!在十进制中,表示相同值的“1”位并不总是少于表示相同值的“1”位。 但问题依然存在:是否还有其他“最佳”基需要最少数量的1位来存储大阶乘

有人问:“你怎么储存这些号码?” 嗯,这正是我的问题——存储形式为n的数字的最佳方式是什么? 我可以在内部使用以10为基数的数字,或以2为基数的幂,或以18为基数,或其他一些基数。哪一个最好?
我可以在内部将这些整数存储为一个1D数字数组,长度是存储所有数字所需的长度。是否有任何合理的方法打印出100!在没有这样一个数组的十进制中?

我不会假装我懂任何数学,所以不要把我的答案当作你可能在寻找的神圣的“最佳值”。如果我必须尽可能快地进行阶乘运算,我会尝试一些近似(比如斯特林近似),或者减少乘法的次数,因为乘法是一种昂贵的运算。如果用k基表示数字,可以借助移位模拟k的乘法。如果选择2进制,则所有乘法的一半将是移位。其他乘法是移位和一位开关。如果您的目标是在数字表示中最小化“1”的数量,这取决于您所表示的数字。随着基数的增加,表示给定数字的“1”将减少,但每个顺序需要更多的位,这意味着更多的潜在“1”。我希望它至少有一点帮助,如果没有,请提问,我将尝试回答。

如果您只是尝试优化计算阶乘的运行时间,并且更改基数是您要更改的唯一参数,那么最佳基数可能包含小的因素。60可能是一个合理的选择。如果你想做实验,我会尝试(2^a)(3^b)(5^c)形式的各种基础

提高乘法速度可能是提高性能的最佳方法。你用什么算法乘法?(课本,卡拉祖巴,图姆库克,FFT,…)

还有其他因素要考虑。如果要经常将数字转换为十进制,则基数为10的幂将使转换尽可能快

许多(*)年前,我编写了一个base-6浮点库,专门用于解决重复的乘/除2和/或3的问题。但是,除非你试图解决一个特定的问题,否则我认为总体上优化你的算法会比仅仅优化阶乘更好

凯斯文

(*)我最初说“几年前”,直到我记得该程序在12Mhz 80286上运行了很多天。

如果“1”位是指数字,那么我建议以256或65536为基数。换言之,为了数学的目的,将每个字节/单词设为一个“数字”。计算机定期处理这些数字,并为此进行了优化。您的阶乘将是快速的,其他操作也是如此

更不用说计算机能处理大量的数据了