#include double powers[12] = { 1.0 /* 2^0 */ , 4194304.0 /* 2^22 */ , 8796093022208.0 /* 2^43 */ , 18446744073709551616.0 /* 2^64 */ , 38685626227668133590597632.0 /* 2^85 */ , 162259276829213363391578010288128.0 /* 2^107 */ , 340282366920938463463374607431768211456.0 /* 2^128 */ , 713623846352979940529142984724747568191373312.0 /* 2^149 */ , 1496577676626844588240573268701473812127674924007424.0 /* 2^170 */ , 6277101735386680763835789423207666416102355444464034512896.0 /* 2^192 */ , 13164036458569648337239753460458804039861886925068638906788872192.0 /* 2^213 */ , 27606985387162255149739023449108101809804435888681546220650096895197184.0 /* 2^234 */ } ; double f[12]; double g[12]; double h[12]; extern void curve25519_sub(double [12],const double [12],const double [12]); int main(int argc,char **argv) { int i; for (i = 0;i < 12;++i) f[i] = random() * powers[i]; printf("f=0"); for (i = 0;i < 12;++i) printf("%+.0f",f[i]); printf(";\n"); for (i = 0;i < 12;++i) g[i] = random() * powers[i]; printf("g=0"); for (i = 0;i < 12;++i) printf("%+.0f",g[i]); printf(";\n"); curve25519_sub(h,f,g); printf("h=0"); for (i = 0;i < 12;++i) printf("%+.0f",h[i]); printf(";\n"); printf("h-(f-g)\n"); return 0; }