#ifndef _INC_IMATH
#define _INC_IMATH

void izero(unsigned int *dest,int n);
void iinit(unsigned int *dest,unsigned int val,int n);
void icpy(unsigned int *src,unsigned int *dest,int n);
int  itest(unsigned int *src,int n);
int  icmp1(unsigned int *src,unsigned int val,int n);
int  ineg(unsigned int *arg,int n);  // ret = notzero
void inot(unsigned int *arg,int n);
int  iadd(unsigned int *src1,unsigned int *src2,unsigned int *dest,int n);  // ret = carry
int  isub(unsigned int *src,unsigned int *sub,unsigned int *dest,int n);  // ret = borrow
void iaddx(unsigned int val,unsigned int *dest);
void isubx(unsigned int val,unsigned int *dest);
void imuladd(unsigned int *src,unsigned int val,unsigned int *arg,int n);
void imulsub(unsigned int *src,unsigned int val,unsigned int *arg,int n);
void imul(unsigned int *src1,unsigned int *src2,unsigned int *ddest,int n);
void isqr(unsigned int *src,unsigned int *ddest,int n);
void imuls(unsigned int *src1,unsigned int *src2,unsigned int *ddest,int n);
int  icmp(unsigned int *src1,unsigned int *src2,int n);
int  icmps(unsigned int *src1,unsigned int *src2,int n);
void ishft(unsigned int *arg,int shift,int n);  // s = shift up  -s = shift down
void ibshft(unsigned int *arg,int shift,int n);  // s = shift up  -s = shift down
int  imulx(unsigned int *arg,int value,int addin,int n);  // ret = overflow
int  idivx(unsigned int *arg,int div,int n);  // ret = remainder
int  iremx(unsigned int *arg,int div,int n);  // ret = remainder
int  iinput(char *str,unsigned int *dest,int n);
int  ifmt(unsigned int *src,int n,char *dest,int length,int radix);   // -r = signed  ret = spaces
int  iprnt(unsigned int *src,int n,int radix);   // -r = signed
int  idiv(unsigned int *darg,unsigned int *div,unsigned int *res,int n);
int  idivs(unsigned int *darg,unsigned int *div,unsigned int *res,int n);
int  iaddm(unsigned int *src1,unsigned int *src2,unsigned int *mod,unsigned int *dest,int n);
int  imulm(unsigned int *src1,unsigned int *src2,unsigned int *mod,unsigned int *dest,int n);
int  iexp(unsigned int *base,unsigned int *exp,unsigned int *mod,unsigned int *dest,int n);
int  iinv(unsigned int *src,unsigned int *mod,unsigned int *dest,int n); // RET=1 Res = Common Factor
int  igcd(unsigned int *src1,unsigned int *src2,unsigned int *dest,int n); // RET=1  GCD = 1
int  isqrt(unsigned int *dsrc,unsigned int *dest,int n);

// User Buffer Versions  1,2,2,4,7,12,3 Buffers Required

int  ifmtb(unsigned int *src,int n,char *dest,int length,int radix,unsigned int *buff);   // -r = signed  ret = spaces
int  iaddmb(unsigned int *src1,unsigned int *src2,unsigned int *mod,unsigned int *dest,int n,unsigned int *buff);
int  imulmb(unsigned int *src1,unsigned int *src2,unsigned int *mod,unsigned int *dest,int n,unsigned int *buff);
int  iexpb(unsigned int *base,unsigned int *exp,unsigned int *mod,unsigned int *dest,int n,unsigned int *buff);
int  iinvb(unsigned int *src,unsigned int *mod,unsigned int *dest,int n,unsigned int *buff); // RET=1 Res = Common Factor
int  igcdb(unsigned int *src1,unsigned int *src2,unsigned int *dest,int n,unsigned int *buff); // RET=1  GCD = 1
void isqrtb(unsigned int *dsrc,unsigned int *dest,int n,unsigned int *buff);

#endif
