⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iint.h

📁 Arithmetic for integers of almost unlimited size for C and C++. Developed and copyrighted by Ra
💻 H
字号:
/* Integer Version 2.1a, TP, 5.10.94	iint.h	*//* Integer Version 2.1, RD, 16.7.93	iint.h	*//* Integer Version 2.0, RD, 15.1.93	iint.h	*/#ifndef _IINT_H#define _IINT_Htypedef unsigned long 	DigitType;#define BitsPerDigit	(sizeof(DigitType)*8)/* Need definiton of FILE */#include <stdio.h>/*	Here is the part of c_varieties.h we shall use	*/#ifndef C_VARIETIES_H#ifdef __cplusplus#define EXTERN_FUNCTION( rtn, args ) extern "C" { rtn args; }#define _VOID_ /* anachronism */#else#ifdef __STDC__#ifdef __PARC__#define EXTERN_FUNCTION( rtn, args ) rtn();#define _VOID_#define const#else#define EXTERN_FUNCTION( rtn, args ) rtn args;#define _VOID_ void#endif#else#define EXTERN_FUNCTION( rtn, args ) rtn();#define _VOID_#define const#endif#endif#endif/*	And now come some useful definitions	*/#ifndef BOOLEANDEF#define BOOLEANDEF    typedef int     BOOLEAN;#endif#ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif#ifndef NULL#define NULL 0#endif/* These are the signs of our Integers */#define PLUS 0#define MINUS 1/*	This is the main data type	*/typedef struct {    DigitType   *vec;    int         maxlength, length, sign;}               Integer, *pInteger;/* added to allow changing of Ierror() TP */#ifdef __STDC__typedef void (*Ierror_handler)(const char *);#elsetypedef void (*Ierror_handler)();#endifextern Ierror_handler Ierror;/*      Special sort of code to name the functions:        I:      Integer        int:    int        as:     assign        pl:     plus        mi:     minus	eq:	equal	gt:	greater than	mu:	multiply	sl:	shift left	sr:	shift right*/EXTERN_FUNCTION(void cI, (Integer *))			/* Creator */EXTERN_FUNCTION(void cIasint, (Integer *, int))	/* Creator + Init int */EXTERN_FUNCTION(void cIasuint, (Integer *, unsigned int))	/* Creator + Init unsigned int */EXTERN_FUNCTION(void cIaslong, (Integer *, long))	/* Creator + Init long */EXTERN_FUNCTION(void cIasulong, (Integer *, unsigned long))	/* Creator + Init unsigned long */EXTERN_FUNCTION(void cIasI, (Integer *, const Integer *))	/* Creator + Init Int */EXTERN_FUNCTION(void cImaxlength, (Integer *, int)) 	/* maxlength wird vorgegeben */EXTERN_FUNCTION(void dI, (Integer *))			/* Destructor */EXTERN_FUNCTION(Integer * ncI, (_VOID_))		/* new Integer + cI */EXTERN_FUNCTION(Integer * ncIasint, (int))	/* new Integer + cIasint */EXTERN_FUNCTION(Integer * ncIasuint, (unsigned int))	/* new Integer + cIasuint */EXTERN_FUNCTION(Integer * ncIaslong, (long))	/* new Integer + cIaslong */EXTERN_FUNCTION(Integer * ncIasulong, (unsigned long))	/* new Integer + cIasulong */EXTERN_FUNCTION(Integer * ncIasI, (Integer *))	/* new Integer + cIasI */EXTERN_FUNCTION(Integer * ncImaxlength, (int))	/* new Integer + cImaxlength */EXTERN_FUNCTION(void ddI, (Integer *))		/* dI + delete Integer */EXTERN_FUNCTION(void default_Ierror, (const char *))/*	 Error message */EXTERN_FUNCTION(void IasI, (Integer *, const Integer *))	/* Assignment */EXTERN_FUNCTION(void Iasint, (Integer *, int))	    /* Assignment of an int */EXTERN_FUNCTION(void Iasuint, (Integer *, unsigned int)) /* Assignment of an unsigned int */EXTERN_FUNCTION(void Iaslong, (Integer *, long))	    /* Assignment of an long */EXTERN_FUNCTION(void Iasulong, (Integer *, unsigned long)) /* Assignment of an unsigned long */EXTERN_FUNCTION(void Iasdbl, (Integer *, double)) /* Assignment of a double */EXTERN_FUNCTION(void Ias0, (Integer *))EXTERN_FUNCTION(void Ias1, (Integer *))#ifdef USE_THIS_LOT_OF_MACROS#define IAS0(A) ((A)->length=0, (A)->sign=PLUS)#define IAS1(A) ((A)->length=1, *((A)->vec)=1, (A)->sign=PLUS)#endifEXTERN_FUNCTION(BOOLEAN Iisint, (const Integer *))EXTERN_FUNCTION(BOOLEAN Iisuint, (const Integer *))EXTERN_FUNCTION(BOOLEAN Iislong, (const Integer *))EXTERN_FUNCTION(BOOLEAN Iisulong, (const Integer *))EXTERN_FUNCTION(int intasI, (const Integer *))EXTERN_FUNCTION(unsigned int uintasI, (const Integer *))EXTERN_FUNCTION(long longasI, (const Integer *))EXTERN_FUNCTION(unsigned long ulongasI, (const Integer *))EXTERN_FUNCTION(int Ilog, (const Integer *))	/* Two's logarithm */EXTERN_FUNCTION(int intlog, (int))	/* Two's logarithm */EXTERN_FUNCTION(void IasIplI, (Integer *, const Integer *, const Integer *))	/* Addition + */EXTERN_FUNCTION(void IasImiI, (Integer *, const Integer *, const Integer *))	/* Subtraction - */EXTERN_FUNCTION(void IplasI, (Integer *, const Integer *))	/* Addition += */EXTERN_FUNCTION(void ImiasI, (Integer *, const Integer *))	/* Subtraction -= */EXTERN_FUNCTION(void Ineg, (Integer *))	/* Change the sign */EXTERN_FUNCTION(void Iinc, (Integer *))		/* ++ */EXTERN_FUNCTION(void Idec, (Integer *))		/* -- */EXTERN_FUNCTION(BOOLEAN IeqI, (const Integer *, const Integer *))	/* Test equality == */EXTERN_FUNCTION(BOOLEAN IgtI, (const Integer *, const Integer *))	/* Test greater > */EXTERN_FUNCTION(BOOLEAN IneI, (const Integer *, const Integer *))EXTERN_FUNCTION(BOOLEAN IgeI, (const Integer *, const Integer *))EXTERN_FUNCTION(BOOLEAN IltI, (const Integer *, const Integer *))EXTERN_FUNCTION(BOOLEAN IleI, (const Integer *, const Integer *))EXTERN_FUNCTION(BOOLEAN Ige0, (const Integer *))EXTERN_FUNCTION(BOOLEAN Igt0, (const Integer *))EXTERN_FUNCTION(BOOLEAN Ile0, (const Integer *))EXTERN_FUNCTION(BOOLEAN Ilt0, (const Integer *))EXTERN_FUNCTION(BOOLEAN Ieq0, (const Integer *))EXTERN_FUNCTION(BOOLEAN Ieq1, (const Integer *))#ifdef USE_THIS_LOT_OF_MACROS#define INEI(A, B)	(!IeqI((A), (B)))#define IGEI(A, B)	(!IgtI((B), (A)))#define ILTI(A, B)	(IgtI((B), (A)))#define ILEI(A, B)	(!IgtI((A), (B)))#define IGE0(A)		((A)->sign==PLUS)#define IGT0(A)		(((A)->sign==PLUS)&&((A)->length))#define ILE0(A)		(!(A)->length || ((A)->sign==MINUS))#define ILT0(A)		((A)->sign==MINUS)#define IEQ0(A)		(!(A)->length)#define IEQ1(A)	((*((A)->vec)==1)&&((A)->length==1)&&((A)->sign==PLUS))#endifEXTERN_FUNCTION(void IasIandI, (Integer *, const Integer *, const Integer *))	/* bitweise And, & */EXTERN_FUNCTION(void IasIxorI, (Integer *, const Integer *, const Integer *))	/* bitweise Xor, ^ */EXTERN_FUNCTION(void IasIorI, (Integer *, const Integer *, const Integer *))	/* bitweise Or, | */EXTERN_FUNCTION(void IasnotI, (Integer *, const Integer *))	/* bitweise Not, ~ */EXTERN_FUNCTION(void IandasI, (Integer *, const Integer *))	/*  bitweise And with Assign &= */EXTERN_FUNCTION(void IxorasI, (Integer *, const Integer *))	/*  bitweise Xor with Assign ^= */EXTERN_FUNCTION(void IorasI, (Integer *, const Integer *))	/*  bitweise Or with Assign |= */#ifdef USE_THIS_LOT_OF_MACROS#define IANDASI(A, B)	IasIandI(A, A, B)	#define IXORASI(A, B)	IasIxorI(A, A, B)	#define IORASI(A, B)	IasIorI(A, A, B)	#endifEXTERN_FUNCTION(void IasIpowD, (Integer *, const Integer *, DigitType))	/* power DigitType */EXTERN_FUNCTION(void Iroot, (Integer *, const Integer *, DigitType))	/* newton n-th root */EXTERN_FUNCTION(void IassqrtI, (Integer *, const Integer *))	/* sqrt */EXTERN_FUNCTION(void IasImuI, (Integer *, const Integer *, const Integer *))	/* Multiplication * */EXTERN_FUNCTION(void ImuasI, (Integer *, const Integer *))	/* Multiplication *= */EXTERN_FUNCTION(void IasImuD, (Integer *, const Integer *, DigitType))	/* Multiplication with DigitType */EXTERN_FUNCTION(void ImuasD, (Integer *, DigitType))EXTERN_FUNCTION(void IasIsrD, (Integer *, const Integer *, DigitType))	/* Shift to the right */EXTERN_FUNCTION(void IsrasD, (Integer *, DigitType))	/* Shift to the right */EXTERN_FUNCTION(void IasIslD, (Integer *, const Integer *, DigitType))	/* Shift to the left */EXTERN_FUNCTION(void IslasD, (Integer *, DigitType))	/* Shift to the left */EXTERN_FUNCTION(BOOLEAN Isr1, (Integer *))	/* Shift by one */EXTERN_FUNCTION(BOOLEAN Ieven, (const Integer *))	/* is a even? */#ifdef USE_THIS_LOT_OF_MACROS#define IEVEN(A)	(!(*((A)->vec) & 1))#endifEXTERN_FUNCTION(DigitType uIdiasD, (Integer *, DigitType))	/* Division by DigitType, no sign, return remainder. */EXTERN_FUNCTION(DigitType IdiasD, (Integer *, DigitType))	/* Division by DigitType, with sign, return remainder. */EXTERN_FUNCTION(DigitType uIasIdiD, (Integer *, const Integer *, DigitType))	/* Division by DigitType, no sign, return remainder. */EXTERN_FUNCTION(DigitType IasIdiD, (Integer *, const Integer *, DigitType))	/* Division by DigitType, with sign, return remainder. */EXTERN_FUNCTION(void uIdiv, (Integer *q, Integer *r, const Integer *a, const Integer *b))	/* Division with remainder a=bq+r, no sign */EXTERN_FUNCTION(void Idiv, (Integer *q, Integer *r, const Integer *a, const Integer *b))	/* Division with remainder a=bq+r, with sign */EXTERN_FUNCTION(void IasIdiI, (Integer *, const Integer *, const Integer *))	/* Division, quotient */EXTERN_FUNCTION(void IasIreI, (Integer *, const Integer *, const Integer *))	/* Division, remainder */EXTERN_FUNCTION(void IdiasI, (Integer *, const Integer *))	/* Division, quotient */EXTERN_FUNCTION(void IreasI, (Integer *, const Integer *))	/* Division, remainder */EXTERN_FUNCTION(int fscanI, (FILE *, Integer *))	/* Input from file */EXTERN_FUNCTION(int fprintI, (FILE *, const Integer *))	/* Output to file */EXTERN_FUNCTION(void Idgcd, (Integer *d, const Integer *a, const Integer *b))	/* Euklid's Algorithm (Division)  d=gcd(a, b); */EXTERN_FUNCTION(void Ibgcd, (Integer *d, const Integer *a, const Integer *b))	/* Binary gcd */#define Igcd	Ibgcd	/* Standard gcd	*/EXTERN_FUNCTION(void Idxgcd,(Integer*d,Integer*u,Integer*v,const Integer*a,const Integer*b))	/* Extended gcd:  d=gcd(a, b)==ua+vb; */EXTERN_FUNCTION(void Idxgcd_left,(Integer*d,Integer*u,const Integer*a,const Integer*b))	/* Extended gcd:  d=gcd(a, b)==ua+?b; */#define Ixgcd	IdxgcdEXTERN_FUNCTION(void Ibxgcd,(Integer*d,Integer*u,Integer*v,const Integer*a,const Integer*b))	/* Binary xgcd */EXTERN_FUNCTION(void Ireduce, (Integer *a, Integer *b))	/* reduce gcd */EXTERN_FUNCTION(void IseedD, (DigitType x))EXTERN_FUNCTION(void IasrandomI, (Integer * a, const Integer * b)) /*  * Randomgenerator: choose random a with 0<=|a|<|b|, a->sign=b->sign.  * a and b have to be distinct.  *//* Now come some functions for fast writing and reading or sending and * receiving Integers. The result of these functions are pointers to * memory blocks consisting of l bytes, that have to be sent/received * by appropriate funtions. *	The calling sequences are: *	- sender:	p=wIdata1(a, &l); *			send(channel, p, l);	(or write(file, p, l); ...) *			p=wIdata2(a, &l); *			send(channel, p, l); *	- receiver:	p=rIdata1(a, &l); *			receive(channel, p, l); *			p=rIdata2(a, &l); *			receive(channel, p, l); */EXTERN_FUNCTION(char *wIdata1, (const Integer * a, int *l))EXTERN_FUNCTION(char *wIdata2, (const Integer * a, int *l))EXTERN_FUNCTION(char *rIdata1, (const Integer * a, int *l))EXTERN_FUNCTION(char *rIdata2, (Integer * a, int *l))EXTERN_FUNCTION(int Itoa, (const Integer * n, char s[]))EXTERN_FUNCTION(int atoI, (char s[], Integer * n))EXTERN_FUNCTION(void IprintStatistics, (_VOID_))#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -