Version 3 of tcl::tommath

Updated 2009-09-30 19:42:25 by AMG

[add information about this math package, added to the core in tcl 8.5 ]


AMG: Are there any extensions that use the tommath bignum library [L1 ] portion of Tcl? I wrote one at work, but in order to make it compile, I had to create an empty file called tommath_class.h and put it somewhere in the "-I" header include path. This is because tclTomMath.h contains the line #include <tommath_class.h>, but it doesn't seem to actually use anything that may be defined in tommath_class.h. See 1941434 for more information.

Once I got that out of the way, I found that tommath wasn't all that hard to use. I couldn't find any documentation, so I just read the source, which was easy to understand. Here's code to convert between a Tcl_WideUInt and an mp_int:

mp_int wideuint_to_bignum(Tcl_WideUInt uwide)
{
    mp_int bignum = {0, 0, MP_ZPOS, NULL};
    if (mp_init_size(&bignum, (CHAR_BIT * sizeof(Tcl_WideUInt)
                              + DIGIT_BIT - 1) / DIGIT_BIT) == MP_OKAY) {
        for (; uwide != 0; ++bignum.used) {
            bignum.dp[bignum.used] = (mp_digit)(uwide & MP_MASK);
            uwide >>= MP_DIGIT_BIT;
        }
    }

    /* The caller is responsible for freeing the allocated digits of the bignum
     * by using mp_clear().  Tcl does this when the bignum is placed inside a
     * Tcl_Obj.  bignum_to_wideuint() likewise internally frees the digits. */
    return bignum;
}

Tcl_WideUInt bignum_to_wideuint(mp_int bignum)
{
    Tcl_WideUInt uwide = 0;
    int i;
    for (i = 0; i < bignum.used; ++i) {
        uwide = (uwide << MP_DIGIT_BIT) | bignum.dp[i];
    }
    mp_clear(&bignum);
    return uwide;
}

These functions are adapted from the tommath sources. I used them with Tcl_TakeBignumFromObj() and Tcl_NewBignumObj() [L2 ] to put unsigned wide integers in Tcl_Objs.

Lars H: Re documentation, there is a 1.1MB PDF file in CVS: tcl/libtommath/tommath.pdf.