From ad3496a66d2810c2368bc86bd2904255d48e214e Mon Sep 17 00:00:00 2001 From: Dirk Engling Date: Mon, 15 Jul 2013 14:41:24 +0200 Subject: Stable version --- sqr.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 sqr.c diff --git a/sqr.c b/sqr.c new file mode 100644 index 0000000..f4826e7 --- /dev/null +++ b/sqr.c @@ -0,0 +1,96 @@ +#include +#include +#include + +typedef uint8_t leg_t; +typedef uint16_t dleg_t; + +#if 0 +static void mp_sqr( leg_t *result, leg_t const * a, int legs ) +{ + while( legs-- ) { + leg_t *offs = result+2*legs+1; + leg_t fac = a[legs]; + int leg = legs; + dleg_t acc = (dleg_t)*offs + (dleg_t)fac * fac; + + *(offs--) = (leg_t)acc; + acc >>= 8*sizeof(leg_t); + + while( leg-- ) + { + dleg_t subresult = fac * a[leg]; + int carry = !!(subresult & (1<<(8*sizeof(dleg_t)-1))); + + subresult <<= 1; + acc += subresult + *offs; + + *(offs--) = (leg_t)acc; + acc >>= 8*sizeof(leg_t); + acc += carry; + } + + while( acc ) + { + acc += *offs; + *(offs--) = (leg_t)acc; + acc >>= 8*sizeof(leg_t); + } + } +} +#else +static void mp_sqr( leg_t *result, leg_t const * a, int legs ) +{ +int i; + while( legs-- ) { + leg_t *offs = result+2*legs+1; + leg_t fac = a[legs]; + int leg = legs,i; + dleg_t acc = (dleg_t)*offs + (dleg_t)fac * (dleg_t)fac; + + *(offs--) = (leg_t)acc; + acc >>= 8*sizeof(leg_t); + + while( leg-- ) + { + dleg_t subresult = (dleg_t)fac * (dleg_t)a[leg]; + int carry = 1 & ( subresult >> (16*sizeof(leg_t)-1)); + + subresult ^= carry << (16*sizeof(leg_t)-1); + + acc += 2 * subresult + (dleg_t)*offs; + *(offs--) = (leg_t)acc; + + acc >>= 8*sizeof(leg_t); + acc += (dleg_t)carry << 8*sizeof(leg_t); + +printf( "%04X %04X %d\n", acc, subresult, carry ); + + } + for(i=0;i<6;++i) + printf( "%02X", result[i] ); + + putchar(10); + while( acc ) + { + acc += (dleg_t)*offs; + *(offs--) = (leg_t)acc; + acc >>= 8*sizeof(leg_t); + } + } + for(i=0;i<6;++i) + printf( "%02X", result[i] ); + putchar(10); + } +#endif + +int main() { + leg_t a[3] = { 0xff, 0xff, 0xa1 }; + leg_t r[6] = {0,0,0,0,0,0}; + int i; + + mp_sqr( r, a, 3 ); + for(i=0;i<6;++i) + printf( "%02X", r[i] ); + putchar(10); +} -- cgit v1.2.3