[Python-Dev] Long Multiplication is not commutative.

Christian Tismer tismer@tismer.com
Thu, 06 Apr 2000 23:31:03 +0200


Yikes!

No, it is computatively commutative, just not in terms
of computation time. :-))

The following factorial loops differ by a remarkable
factor of 1.8, and we can gain this speed by changing
long_mult to always put the lower multiplicand into the left.

This was reported to me by Lenny Kneler, who thought he had
found a Stackless bug, but he was actually testing long math. :-)

This buddy...

>>> def ifact3(n) :
...  p = 1L
...  for i in range(1,n+1) :
...    p = i*p
...  return p

performs better by a factor of 1.8 than this one:

>>> def ifact1(n) :
...  p = 1L
...  for i in range(1,n+1) :
...    p = p*i
...  return p

The analysis of this behavior is quite simple if you look at the
implementation of long_mult. If the left operand is big and the
right is small, there are much more carry operations performed,
together with more loop overhead.
Swapping the multiplicands would be a 5 line patch.
Should I submit it?

ciao - chris

-- 
Christian Tismer             :^)   <mailto:tismer@appliedbiometrics.com>
Applied Biometrics GmbH      :     Have a break! Take a ride on Python's
Kaunstr. 26                  :    *Starship* http://starship.python.net
14163 Berlin                 :     PGP key -> http://wwwkeys.pgp.net
PGP Fingerprint       E182 71C7 1A9D 66E9 9D15  D3CC D4D7 93E2 1FAE F6DF
     where do you want to jump today?   http://www.stackless.com