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

📄 zmath.h

📁 Calc Software Package for Number Calc
💻 H
📖 第 1 页 / 共 2 页
字号:
extern DLL BOOL zcmp(ZVALUE z1, ZVALUE z2);/* * More complicated numeric functions. */extern DLL FULL uugcd(FULL i1, FULL i2);extern DLL long iigcd(long i1, long i2);extern DLL void zgcd(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL void zlcm(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL void zreduce(ZVALUE z1, ZVALUE z2, ZVALUE *z1res, ZVALUE *z2res);extern DLL void zfact(ZVALUE z, ZVALUE *dest);extern DLL void zperm(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL int zcomb(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL FLAG zjacobi(ZVALUE z1, ZVALUE z2);extern DLL void zfib(ZVALUE z, ZVALUE *res);extern DLL void zpowi(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL void ztenpow(long power, ZVALUE *res);extern DLL void zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res);extern DLL BOOL zmodinv(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL BOOL zrelprime(ZVALUE z1, ZVALUE z2);extern DLL long zlog(ZVALUE z1, ZVALUE z2);extern DLL long zlog10(ZVALUE z, BOOL *was_10_power);extern DLL long zdivcount(ZVALUE z1, ZVALUE z2);extern DLL long zfacrem(ZVALUE z1, ZVALUE z2, ZVALUE *rem);extern DLL long zgcdrem(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL long zdigits(ZVALUE z1);extern DLL long zdigit(ZVALUE z1, long n);extern DLL FLAG zsqrt(ZVALUE z1, ZVALUE *dest, long R);extern DLL void zroot(ZVALUE z1, ZVALUE z2, ZVALUE *dest);extern DLL BOOL zissquare(ZVALUE z);extern DLL void zhnrmod(ZVALUE v, ZVALUE h, ZVALUE zn, ZVALUE zr, ZVALUE *res);/* * Prime related functions. */extern DLL FLAG zisprime(ZVALUE z);extern DLL FULL znprime(ZVALUE z);extern DLL FULL next_prime(FULL v);extern DLL FULL zpprime(ZVALUE z);extern DLL void zpfact(ZVALUE z, ZVALUE *dest);extern DLL BOOL zprimetest(ZVALUE z, long count, ZVALUE skip);extern DLL BOOL zredcprimetest(ZVALUE z, long count, ZVALUE skip);extern DLL BOOL znextcand(ZVALUE z1, long count, ZVALUE skip, ZVALUE res, ZVALUE mod, ZVALUE *cand);extern DLL BOOL zprevcand(ZVALUE z1, long count, ZVALUE skip, ZVALUE res, ZVALUE mod, ZVALUE *cand);extern DLL FULL zlowfactor(ZVALUE z, long count);extern DLL FLAG zfactor(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL long zpix(ZVALUE z1);extern DLL void zlcmfact(ZVALUE z, ZVALUE *dest);/* * Misc misc functions. :-) */extern DLL void zsquaremod(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL void zminmod(ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL BOOL zcmpmod(ZVALUE z1, ZVALUE z2, ZVALUE z3);extern DLL void zio_init(void);/* * These functions are for internal use only. */extern DLL void ztrim(ZVALUE *z);extern DLL void zshiftr(ZVALUE z, long n);extern DLL void zshiftl(ZVALUE z, long n);extern DLL HALF *zalloctemp(LEN len);/* * Modulo arithmetic definitions. * Structure holding state of REDC initialization. * Multiple instances of this structure can be used allowing * calculations with more than one modulus at the same time. * Len of zero means the structure is not initialized. */typedef struct {	LEN len;		/* number of words in binary modulus */	ZVALUE mod;		/* modulus REDC is computing with */	ZVALUE inv;		/* inverse of modulus in binary modulus */	ZVALUE one;		/* REDC format for the number 1 */} REDC;extern DLL REDC *zredcalloc(ZVALUE z1);extern DLL void zredcfree(REDC *rp);extern DLL void zredcencode(REDC *rp, ZVALUE z1, ZVALUE *res);extern DLL void zredcdecode(REDC *rp, ZVALUE z1, ZVALUE *res);extern DLL void zredcmul(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res);extern DLL void zredcsquare(REDC *rp, ZVALUE z1, ZVALUE *res);extern DLL void zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res);/* * macro expansions to speed this thing up */#define ziseven(z)	(!(*(z).v & 0x1))#define zisodd(z)	(*(z).v & 0x1)#define ziszero(z)	((*(z).v == 0) && ((z).len == 1))#define zisneg(z)	((z).sign)#define zispos(z)	(((z).sign == 0) && (*(z).v || ((z).len > 1)))#define zisunit(z)	((*(z).v == 1) && ((z).len == 1))#define zisone(z)	((*(z).v == 1) && ((z).len == 1) && !(z).sign)#define zisnegone(z)	((*(z).v == 1) && ((z).len == 1) && (z).sign)#define zltnegone(z)	(zisneg(z) && (((z).len > 1) || *(z).v > 1))#define zistwo(z)	((*(z).v == 2) && ((z).len == 1) && !(z).sign)#define zisabstwo(z)	((*(z).v == 2) && ((z).len == 1))#define zisabsleone(z)	((*(z).v <= 1) && ((z).len == 1))#define zislezero(z)	(zisneg(z) || ziszero(z))#define zisleone(z)	(zisneg(z) || zisabsleone(z))#define zistiny(z)	((z).len == 1)/* * zgtmaxfull(z)	TRUE if abs(z) > MAXFULL */#define zgtmaxfull(z)	(((z).len > 2) || (((z).len == 2) && (((SHALF)(z).v[1]) < 0)))/* * zgtmaxufull(z)	TRUE if abs(z) will not fit into a FULL (> MAXUFULL) */#define zgtmaxufull(z)	((z).len > 2)/* * zgtmaxulong(z)	TRUE if abs(z) > MAXULONG */#if BASEB >= LONG_BITS#define zgtmaxulong(z)	((z).len > 1)#else#define zgtmaxulong(z)	zgtmaxufull(z)#endif/* * zgtmaxlong(z)	TRUE if abs(z) > MAXLONG */#if BASEB >= LONG_BITS#define zgtmaxlong(z)	(((z).len > 1) || (((z).len == 1) && (((SHALF)(z).v[0]) < 0)))#else#define zgtmaxlong(z)	zgtmaxfull(z)#endif/* * Some algorithms testing for values of a certain length.  Macros such as * zistiny() do this well.  In other cases algorthms require tests for values * in comparison to a given power of 2.	 In the later case, zistiny() compares * against a different power of 2 on a 64 bit machine.	The macros below * provide a tests against powers of 2 that are independent of the work size. * *	zge16b(z)	TRUE if abs(z) >= 2^16 *	zge24b(z)	TRUE if abs(z) >= 2^24 *	zge31b(z)	TRUE if abs(z) >= 2^31 *	zge32b(z)	TRUE if abs(z) >= 2^32 *	zge64b(z)	TRUE if abs(z) >= 2^64 *	zge128b(z)	TRUE if abs(z) >= 2^128 *	zge256b(z)	TRUE if abs(z) >= 2^256 *	zge512b(z)	TRUE if abs(z) >= 2^512 *	zge1024b(z)	TRUE if abs(z) >= 2^1024 *	zge2048b(z)	TRUE if abs(z) >= 2^2048 *	zge4096b(z)	TRUE if abs(z) >= 2^4096 *	zge8192b(z)	TRUE if abs(z) >= 2^8192 */#if BASEB == 32#define zge16b(z)	(!zistiny(z) || ((z).v[0] >= (HALF)0x10000))#define zge24b(z)	(!zistiny(z) || ((z).v[0] >= (HALF)0x1000000))#define zge31b(z)	(!zistiny(z) || (((SHALF)(z).v[0]) < 0))#define zge32b(z)	(!zistiny(z))#define zge64b(z)	((z).len > 2)#define zge128b(z)	((z).len > 4)#define zge256b(z)	((z).len > 8)#define zge512b(z)	((z).len > 16)#define zge1024b(z)	((z).len > 32)#define zge2048b(z)	((z).len > 64)#define zge4096b(z)	((z).len > 128)#define zge8192b(z)	((z).len > 256)#else#define zge16b(z)	(!zistiny(z))#define zge24b(z)	(((z).len > 2) || (((z).len == 2) && ((z).v[1] >= (HALF)0x100)))#define zge31b(z)	(((z).len > 2) || (((z).len == 2) && (((SHALF)(z).v[1]) < 0)))#define zge32b(z)	((z).len > 2)#define zge64b(z)	((z).len > 4)#define zge128b(z)	((z).len > 8)#define zge256b(z)	((z).len > 16)#define zge512b(z)	((z).len > 32)#define zge1024b(z)	((z).len > 64)#define zge2048b(z)	((z).len > 128)#define zge4096b(z)	((z).len > 256)#define zge8192b(z)	((z).len > 512)#endif/* * ztofull - convert an absolute value of a ZVALUE to a FULL if possible * * If the value is too large, only the low order bits that are able to * be converted into a FULL will be used. */#define ztofull(z)	(zistiny(z) ? ((FULL)((z).v[0])) :		\				      ((FULL)((z).v[0]) +		\				       ((FULL)((z).v[1]) << BASEB)))#define z1tol(z)	((long)((z).v[0]))#define z2tol(z)	((long)(((z).v[0]) + \				(((z).v[1] & MAXHALF) << BASEB)))/* * ztoulong - convert an absolute value of a ZVALUE to an unsigned long * * If the value is too large, only the low order bits that are able to * be converted into a long will be used. */#if BASEB >= LONG_BITS# define ztoulong(z)	((unsigned long)z1tol(z))#else# define ztoulong(z)	((unsigned long)ztofull(z))#endif/* * ztolong - convert an absolute value of a ZVALUE to a long * * If the value is too large, only the low order bits that are able to * be converted into a long will be used. */#define ztolong(z)	((long)(ztoulong(z) & MAXLONG))#define zclearval(z)	memset((z).v, 0, (z).len * sizeof(HALF))#define zcopyval(z1,z2) memcpy((z2).v, (z1).v, (z1).len * sizeof(HALF))#define zquicktrim(z)	{if (((z).len > 1) && ((z).v[(z).len-1] == 0)) \				(z).len--;}#define zfree(z)	freeh((z).v)/* * Output modes for numeric displays. */#define MODE_DEFAULT	0#define MODE_FRAC	1#define MODE_INT	2#define MODE_REAL	3#define MODE_EXP	4#define MODE_HEX	5#define MODE_OCTAL	6#define MODE_BINARY	7#define MODE_MAX	7#define MODE2_OFF	(MODE_MAX+1)#define MODE_INITIAL	MODE_REAL#define MODE2_INITIAL	MODE2_OFF/* * Output routines for either FILE handles or strings. */extern DLL void math_chr(int ch);extern DLL void math_str(char *str);extern DLL void math_fill(char *str, long width);extern DLL void math_flush(void);extern DLL void math_divertio(void);extern DLL void math_cleardiversions(void);extern DLL char *math_getdivertedio(void);extern DLL int math_setmode(int mode);extern DLL int math_setmode2(int mode);extern DLL LEN math_setdigits(LEN digits);extern DLL void math_fmt(char *, ...);/* * The error routine. */extern DLL void math_error(char *, ...);/* * external swap functions */extern DLL HALF *swap_b8_in_HALFs(HALF *dest, HALF *src, LEN len);extern DLL ZVALUE *swap_b8_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all);extern DLL HALF *swap_b16_in_HALFs(HALF *dest, HALF *src, LEN len);extern DLL ZVALUE *swap_b16_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all);extern DLL ZVALUE *swap_HALF_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all);/* * constants used often by the arithmetic routines */extern HALF _zeroval_[], _oneval_[], _twoval_[], _threeval_[], _fourval_[];extern HALF _fiveval_[], _sixval_[], _sevenval_[], _eightval_[], _nineval_[];extern HALF _tenval_[], _elevenval_[], _twelveval_[], _thirteenval_[];extern HALF _fourteenval_[], _fifteenval_[];extern HALF _sqbaseval_[];extern HALF _fourthbaseval_[];extern ZVALUE zconst[];		/* ZVALUE integers from 0 thru 15 */extern ZVALUE _zero_, _one_, _two_, _ten_, _neg_one_;extern ZVALUE _sqbase_, _pow4base_, _pow8base_;extern ZVALUE _b32_, _b64_;extern DLL BOOL _math_abort_;	/* nonzero to abort calculations */extern ZVALUE _tenpowers_[];	/* table of 10^2^n *//* * Bit fiddeling functions and types */extern HALF bitmask[];		/* bit rotation, norm 0 */extern HALF lowhalf[];		/* bit masks from low end of HALF */extern HALF rlowhalf[];		/* reversed bit masks from low end of HALF */extern HALF highhalf[];		/* bit masks from high end of HALF */extern HALF rhighhalf[];	/* reversed bit masks from high end of HALF */#define HAVE_REVERSED_MASKS	/* allows old code to know libcalc.a has them *//* * BITSTR - string of bits within an array of HALFs * * This typedef records a location of a bit in an array of HALFs. * Bit 0 in a HALF is assumed to be the least significant bit in that HALF. * * The most significant bit is found at (loc,bit).  Bits of lesser * significance may be found in previous bits and HALFs. */typedef struct {	HALF *loc;	/* half address of most significant bit */	int bit;	/* bit position within half of most significant bit */	int len;	/* length of string in bits */} BITSTR;#endif /* !__ZMATH_H__*/

⌨️ 快捷键说明

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