On Thu, Dec 10, 2015 at 7:30 AM, FRIGN <d...@frign.de> wrote:
>
> On Wed, 9 Dec 2015 23:44:11 -0800
> Louis Santillan <lpsan...@gmail.com> wrote:
>
> > Are libtommath [0]/tomsfastmath [1] not suckless?
> >
> > [0] https://github.com/libtom/libtommath
> > [1] https://github.com/libtom/tomsfastmath
>
> too complex for my tastes, but don't get me wrong. I know that for
> numerical perfection, you have to dig out very complex methods.
> A good example here are ODE-solvers (Euler, Runge-Kutta,...).
> I think a suckless bignum library should be much more lightweight.
> In the end, we don't want to do simulations on big mainframes,
> but just a library with just enough functions to get around with
> to handle tasks like dc(1) and bc(1).


Well, buried in David Dunfield's Micro-C site and within his
mc323exa.zip [0][1][2] file under MISC/LNUM.C is a Tom St. Denis
ported version of libtommath to the 16-bit not quite ANSI Micro-C.
It's 502 sloc, and will compile with gcc 4.8.4 on Ubuntu 14.04.3 using
CFLAGS="-c -Wall -ansi -pedantic" after you massage it lightly (add
#include <string.h>) to the top.  I haven't tested it so it may make
some bad assumptions about word size, endianess, etc.  Like most of
Tom St. Denis' work, it appears to be not-copyrighted (or public
domain, "Tom St Denis (t...@dasoft.org), Jan 2000.  Distribute like
mad!!!").  See the accompanying MISC/LNUM.TXT [2].  A file list from
the header is copied below.  And if you remember SOH-CAH-TOA, you have
some trig functions as well.

[0] http://www.classiccmp.org/dunfield/dos/index.htm
[1] http://www.classiccmp.org/dunfield/dos/sample.txt
[2] http://www.classiccmp.org/dunfield/dos/mc323exa.zip

Function list
--------------
void l_copy(word *a, word *b) [ Copy the bignum from a to b ]
void l_clear(word *a) [ Set a to zero ]
void l_set(word *a, word n) [ Set a to the digit n ]

int l_iszero(word *a) [ is a == 0 ]
int l_cmp(word *a, word *b) [ compare a and b ]
int l_cmp_d(word *a, word b) [ compare a and 'b' ]

int l_shr(word *a, word *b) [ b = a/2  (return carry) ]
int l_shr_s(word *a) [ a = a/2  (return carry) ]
int l_shl(word *a, word *b) [ b = 2a (return carry) ]
int l_shl_s(word *a) [ a = 2a (return carry) ]

void l_add(word *a, word *b, word *c) [ c = a + b ]
void l_add_s(word *a, word *b) [ a += b ]
void l_add_d(word *a, word b) [ a += 'b' ]
void l_sub(word *a, word *b, word *c) [ c = a - b ]
void l_sub_s(word *a, word *b) [ a -= b ]
void l_sub_d(word *a, word b) [ a -= 'b']
void l_mul(word *a, word *b, word *c) [ c = ab ]
void l_mul_s(word *a, word *b) [ a *= b ]
void l_mul_d(word *a, word b) [ a *= 'b']
void l_div(word *a, word *b, word *q, word *r) [ q = a/b, r = a%b ]
void l_div_s(word *a, word *b) [ a /= b ]
void l_div_d(word *a, word b) [ a /= 'b']
void l_mod(word *a, word *b, word *c) [ c = a%b ]
void l_mod_s(word *a, word *b) [ a %= b ]
word l_mod_d(word *a, word b) [ returns a mod b ]

void l_addmod(word *a, word *b, word *m, word *c) [ c = (a+b) mod m ]
void l_submod(word *a, word *b, word *m, word *c) [ c = (a-b) mod m ]
void l_mulmod(word *a, word *b, word *m, word *c) [ c = (ab) mod m ]

void l_sqr(word *a) [ c = a^2 ]
void l_sqrmod(word *a, word *m, word *c) [ c = a^2 mod m ]
void l_expt(word *a, word *b, word *c) [ c = a^b ]
void l_exptmod(word *a, word *b, word *m, word *c)  [ c = a^b mod m ]

void l_gcd(word *a, word *b, word *c) [ c = gcd(a, b) ]
void l_lcm(word *a, word *b, word *c) [ c = lcm(a, b) ]
void l_invmod(word *a, word *n, word *b) [ b = a^-1 mod n ]
void l_sqrt(word *n, word *N) [ N = n^1/2 ]

void l_print(word *a, word radix, FILE *out) [ Output ]
void l_println(word *a, word radix, FILE *out) [ Output with new line ]

[ radixes from 2 to 64 ]
void l_toradix(word *a, word radix, char *out) [ put in buffer ]
void l_fromradix(char *a, word radix, word *b) [ read string ]

void l_readraw(word *a, unsigned char *in, int len) [ read binary ]
int l_toraw(word *a, unsigned char *out) [ write binary ]

Reply via email to