求n的最后一个非零位的算法!=================================================(W.Bomfim)找到n的最后一个非零数字的问题!受到的关注几位作者。从OEIS序列A008904中,我们可以看到一些作品。这个[1]习题40和54的答案给出了解决这个问题的明确方法对于特殊情况n=1000。似乎没有人试图概括这一点方法编写一个算法来确定给定n值的这个数字。在这里,我们将看到一种方法。I-练习40和54中理论的概括----------------------------------------------------------------n为整数,n>=2,M_5(n)是n!的因式分解中5的重数!,M_2(n)是n!因式分解中2的重数!。用混凝土数学[1]中的同余替换p,我们不!--------==(-l)^M_5(n)*a_h!。。。a_1!a_0!(修改5)(1)5^M_5(n)其中(a_h…a_1a_0)5是n的基数5表示。因此M_2(n)>M_5(n)参见LEMMA 1,不!2^M_5(n)将(1)中的--------乘以--------,我们得到5 ^ M_5(n)2 ^ M_(n)不!-----------------2^M_5(n)==(-l)^M_6(n)*a_h!。。。a_1!a_0!(修改版5)(2)5 ^ M_5(n).2 ^ M_(n)由LEMMA 1 n!可被5^M_5(n)整除!不是可被10^(M_5(n)+a)整除,a>=1。所以这个表达式不!-----------------5 ^ M_5(n).2 ^ M_(n)我们将在下面用I表示,它等于所有n!的起始数字!,除了n!的尾随零!。因此,最后一个I的数字,即I模10,等于n!的最后一个非零数字!。首先,我们将确定I mod 5。从I mod 5很容易找到I mod 10。从(2)我们得到I.2 ^M_5(n)==(-l)^M_6(n)*a_h!。。。a_1!a_0!(修改版5)(3)设m=m_5(n)mod 4。通过下面的LEMMA 2,(3)变为,I.2^m==(-l)^m_5(n)*a_h!。。。a_1!a_0!(修订版5)。由于M_5(n)的奇偶校验等于M的奇偶性,我们得到I.2^m==(-l)^m*a_h!。。。a_1!a_0!(模式5)。(4)对于P=(a_h!…a_1!a_0!)mod 5,它如下所示P==(a_h!mod 5)。。。(a_1!修改5)(a_0!修改五)(修改五)P==2^(t/2)(mod 5),t偶数a_i的和,i=0,1,。。。,小时(5)(5) 是true,因为如果a_i是奇数,即a_i=1或a_i=3,a_i!mod 5=1;因此,对于每个偶数ai,ai!mod 5等于2^(a_i/2),P==2^(t/2)(mod 5)。然后从(4)和(5),I.2^m==(-l)^m*2^(t/2)(mod 5),(6)自然t/2==(t/2)mod 4(mod 4)。根据下面的LEMMA 2,(6)给出I.2^m==(-l)^m*2^((t/2)mod 4)(mod 5)。i=i mod 5,我们得到i.2^m==(-l)^m*2^((t/2)mod 4)(mod 5)。(7)设L是n!的最后一个非零数字!。从LEMMA 1来看,M_2(n)>M_5(n),因此L总是偶数。通过LEMMA 3,因为L=I mod 10,L=I,或L=I+5。我们得出结论,如果i是奇数,L=i+5,如果i是偶数,L=i。由于m和(t/2)mod 4的值都在0到3之间,因此可以写入(7)只能使用下表中描述的方式。+---+------+-----+------------------------------------------------+---+-------+|||(t/2)|||||m|(-1)^m|mod 4|i.2^m==(-l)^m*2^((t/2)mod 4)(mod 5)(7)|i|l|+---+------+-----+------------------------------------------------+---+-------+|0|1|0|i==2^0(mod 5)|1|1+5=6|||1|i==2^1(mod 5)|2|2|||2|i==2^2(mod 5)|4|4|||3|i==2^3(mod 5)|3|3+5=8|+---+------+-----+------------------------------------------------+---+-------+|1|-1|0|2i==-2^0,2i==-1,2i==4,i==2(mod 5)|2|2|||1|2i==-2^1,2i==-2,i==-1(mod 5)|4|4|||2|2i==-2^2,2i==-4,i==-2(mod 5)|3|8||||3|2i==-2^3,2i==-8,i==-4(mod 5)|1|6|+---+------+-----+-------+----------------------------------------+---+-------+|2|1|0|4i==2^0,4i==1,4i==-4,i==-1(mod 5)|4|4|||1|4i==2^1,2i==1,2i==6,i==3(mod 5)|3|8|||2|4i==2^2,4i==4,i==1(mod 5)|1|6|||3|4i==2^3,4i==8,i==2(mod 5)|2|2|+---+------+-----+-------+-------+--------------------------------+---+-------+|3|-1|0|8i==-2^0,3i==-1,3i==-6,i==-2(mod 5)|3|8|||1|8i==-2^1,3i==-2,3i=3,i==1(mod 5)|1|6|||2|8i==-2^2,3i==-4,3i==6,i==2(mod 5)|2|2|||3|8i==-2^3,8i==-8,i==-1(mod 5)|4|4|+---+------+-----+------------------------------------------------+---+-------+从上表中可以确定L,--------------------------------------z<-(x+t/2)模块4;如果z为0,则L<-6,否则L<-2^z。--------------------------------------其中x==m(mod 4)。例如,让x使得m=xmod4=2,那么(-1)^m=1,设t/2 mod 4=0;因此z=2,L=4。我们可以在“2 1 0”行中看到L=4上表中的。重数M_5(n),[2],第1.2.5节,由下式给出M_5(n)=[n/5^1]+[n/5 ^2]+[n/5^3]+。。。(8)从LEMMA 4,对于1<=k<=h,[n/5^k]==(a_h+…+a_k)(mod 4),所以我们可以求x,使x==m(mod 4),通过------------------------------------------------------q<-0;对于i=h,h-1,1,{q<-q+a_i;x<-x+q}。------------------------------------------------------因为在第k次迭代时,上述伪代码中的变量q接收和(a_h+…+a_k)的值,该值与[n/5^k]一致,在最后一次迭代之后,x与M_5(n)同余,并且x与M同余(模块4)。II-算法------------------算法。给定一个整数n,n>=0,求L等于不!。1.[Check n>=2。]如果n=0或1,则算法结束返回1。2.[初始化]设置q<-0;t<-0;x<-0;3.[将n转换为基数5。]让s<-a_h,a1,a0是数字序列五元数中的n。4.[扫描数字。]对于i=h,h-1,1,使q<-q+a_i;x<-x+q;如果a_i是偶数,则设置t<-t+a_i。5.[查找L。]如果a_0是偶数,则设置t<-t+a_0。设置z<-(x+t/2)mod 4;如果z为0,则使L<-6,否则设置L<-2^z。算法结束,L是答案。***从第一节可以很容易地证明该算法是正确的。给定算法的执行时间取决于执行步骤3。当n较大时,可以使用高效的多精度软件包。例如,我使用了函数GMP(MPIR)的mpz_get_str(),[3]。步骤4在O(log n)时间内运行。我们使用O(log n)字节将(n)5的数字存储在C字符串中可以从MSD中一个接一个地找到数字,这就是提出的算法需要,但我不知道如何有效地做到这一点。何时n的几个值在一个序列中给出,在某些情况下,n的转换可以使用前面的结果,从而提高步骤3的效率。我想做这方面的实验。III-引理----------------下面的引理使这个表示“自包含”。雷玛1。对于n>=2,M_2(n)>M_5(n)。对于n=2、3和4,M_2(n)>M_5(n),因为M_5。如果n=5,5=2^3*3^1*5^1,因此M_2(n)>M_5(n)。当n=6,7,我们可以将n写成5k+1、5k+2、5k+3、5k+4、5(k+1);对于k=1,2。如果k是偶数,则5k+2和5k+4都是偶数,因此n取值5k+1至5(k+1),M_2(n)至少增加三倍;5(k+1)是5的幂。奇数k的情况类似。***LEMMA 2。设x和y为正整数。如果x==y(模态4),则2^x==2^y(模态5)。因为2^n的最后一个数字取值为2、4、8、6、2。。。对于n=1,2, ... , 2^x==2^y(mod 10)。[2]第1.2.4节第D定律,其中a=2^x,b=2^y,r=10,r=5,s=2完成了证明。***LEMMA 3。如果x mod 10=r、x mod 5=r或r-5。有一个整数k,k>=0,例如x=10k+r=5k'+r,k'=2k。如果r<5紧接着x mod 5=r。如果r=5+a,0=x mod 5=r,或r-5;我们还有y模5=R=>y mod 10=R,或R+5。***外理4。给定以5为基数的数字n,用a_h.5^h+…+表示a_1.5^1+对于1<=k<=h,a_0.5^0,[n/5^k]与(a_h+…+a_k)(mod 4)同余。[n/5^k]=[(a_h.5^h+…a_1.5^1+a_0.5^0)/5^k]=a_h.5^(h-k)+…+a_k.5^(k-k)=a_h.5^(h-k)+…+答(_k)。证明来自这样一个事实:对于i>=0,5^i模4=1。***工具书类----------[1] 罗纳德·格雷厄姆(Ronald L.Graham)、唐纳德·科努特(Donald E.Knuth)和奥伦·帕塔什尼克(Oren Patashnik),混凝土数学。;Addison-Wesley,第4节,练习40和54。[2] D.E.Knuth,《计算机编程艺术》,第1卷。[3] http://www.mpir.org/mpir-1.3.1.pdf