tango.math.internal.BignumNoAsm

Arbitrary precision arithmetic ('bignum') for processors with no asm support
All functions operate on arrays of uints, stored LSB first. If there is a destination array, it will be the first parameter. Currently, all of these functions are subject to change, and are intended for internal use only. This module is intended only to assist development of high-speed routines on currently unsupported processors. The X86 asm version is about 30 times faster than the D version(DMD).

License:

BSD style: see license.txt

Authors:

Don Clugston
uint multibyteAddSub(char op)(uint[] dest, uint [] src1, uint [] src2, uint carry) [public] #
Multi-byte addition or subtraction dest[] = src1[] + src2[] + carry (0 or 1). or dest[] = src1[] - src2[] - carry (0 or 1). Returns carry or borrow (0 or 1). Set op == '+' for addition, '-' for subtraction.
uint multibyteIncrementAssign(char op)(uint[] dest, uint carry) [public] #
dest[] += carry, or dest[] -= carry. op must be '+' or '-' Returns final carry or borrow (0 or 1)
uint multibyteShl(uint [] dest, uint [] src, uint numbits) [public] #
dest[] = src[] << numbits numbits must be in the range 1..31
void multibyteShr(uint [] dest, uint [] src, uint numbits) [public] #
dest[] = src[] >> numbits numbits must be in the range 1..31
uint multibyteMul(uint[] dest, uint[] src, uint multiplier, uint carry) [public] #
dest[] = src[] * multiplier + carry. Returns carry.
uint multibyteMulAdd(char op)(uint [] dest, uint[] src, uint multiplier, uint carry) [public] #
dest[] += src[] * multiplier + carry(0..FFFF_FFFF). Returns carry out of MSB (0..FFFF_FFFF).
void multibyteMultiplyAccumulate(uint [] dest, uint[] left, uint [] right) [public] #
Sets result = result[0..left.length] + left * right It is defined in this way to allow cache-efficient multiplication. This function is equivalent to:
1
2
3
4
for (int i = 0; i< right.length; ++i) {
    dest[left.length + i] = multibyteMulAdd(dest[i..left.length+i],
            left, right[i], 0);
}
uint multibyteDivAssign(uint [] dest, uint divisor, uint overflow) [public] #
dest[] /= divisor. overflow is the initial remainder, and must be in the range 0..divisor-1.