Max Alekseyev on Fri, 24 Aug 2012 13:40:23 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: How to do fast integer division |
I would try to use X[i,3]\X[j,3] instead of truncate(X[i,3]/X[j,3]). Max On Fri, Aug 24, 2012 at 3:31 PM, Dirk Laurie <dirk.laurie@gmail.com> wrote: > I have an application that does lots of integer divisions with > large operands but small quotients. As a model for that, > I handcoded the extended Euclidean algorithm as follows: > > {mbezout(a,b)= my(X); X=[1,0,a;0,1,b]; if(a<b, i=2;j=1, j=2;i=1); > while(X[j,3]>0, X[i,] -= truncate(X[i,3]/X[j,3])*X[j,]; > i=j; j=3-i); > X[i,] > } > > This code is pretty standard, so I was astounded to see how > slow it is. Timing on 10000-digit numbers: > > ? b1=bezout(a1,a2); > time = 16 ms. > > ? b3=mybezout(a1,a2); > time = 38,622 ms. > > That's a factor of over 2000 slower, not to be explained > by overhead. > > Suspecting that "truncate(X[i,3]/X[j,3])" hides a multitude > of sins (starting with reduction to lowest terms), I changed > it to "truncate(X[i,3]*1./X[j,3])" and the time dropped down > to 200ms. There is a tiny chance that this is not exact, so > I did "divrem(X[i,3],X[j,3])[1]" instead and got 221ms. > > Is that the closest one can get to a fast integer quotient > in Pari/GP? >