std.internal.math.biguintnoasm

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).

Types 1

aliasBigDigit = uint

Functions 11

fnuint multibyteAddSub(char op)(uint[] dest, const(uint) [] src1, const (uint) [] src2, uint carry) pure @nogc @safeMulti-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 sub...
fnuint multibyteIncrementAssign(char op)(uint[] dest, uint carry) pure @nogc @safedest[] += carry, or dest[] -= carry. op must be '+' or '-' Returns final carry or borrow (0 or 1)
fnuint multibyteShl(uint [] dest, const(uint) [] src, uint numbits) pure @nogc @safedest[] = src[] << numbits numbits must be in the range 1 .. 31
fnvoid multibyteShr(uint [] dest, const(uint) [] src, uint numbits) pure @nogc @safedest[] = src[] >> numbits numbits must be in the range 1 .. 31
fnuint multibyteMul(uint[] dest, const(uint)[] src, uint multiplier, uint carry) pure @nogc @safedest[] = src[] * multiplier + carry. Returns carry.
fnuint multibyteMulAdd(char op)(uint [] dest, const(uint)[] src, uint multiplier, uint carry) pure @nogc @safedest[] += src[] * multiplier + carry(0 .. FFFFFFFF). Returns carry out of MSB (0 .. FFFFFFFF).
fnvoid multibyteMultiplyAccumulate(uint [] dest, const(uint)[] left, const(uint) [] right) pure @nogc @safeSets result = result[0 .. left.length] + left * right
fnuint multibyteDivAssign(uint [] dest, uint divisor, uint overflow) pure @nogc @safedest[] /= divisor. overflow is the initial remainder, and must be in the range 0 .. divisor-1.
fnvoid multibyteAddDiagonalSquares(uint[] dest, const(uint)[] src) pure @nogc @safe
fnvoid multibyteTriangleAccumulate(uint[] dest, const(uint)[] x) pure @nogc @safe
fnvoid multibyteSquare(BigDigit[] result, const(BigDigit) [] x) pure @nogc @safe

Variables 2

enumvarKARATSUBALIMIT = 10
enumvarKARATSUBASQUARELIMIT = 12