📄 c_lip_impl.h
字号:
long _b = (b); \
_s = (s); \
_ds = ((_s << 1)+1)*(NTL_FRADIX_INV/2.0); \
_lo = _b*_s; \
_hi = (long) (((double) _b)*_ds); \
}
/* value shifted is 0..3 */
#define zam_loop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_lo = _lo + _a + _t; \
_hi--; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* value shifted is 0..2 */
#define zsx_loop(a,t,nb) \
{ \
long _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_lo = _lo + _t; \
_hi--; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* value shifted is 0..3 */
#define zam_subloop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_hi += 2; \
_lo = _a + _t - _lo; \
(t) = (((unsigned long)(_lo + (_hi<<NTL_NBITS))) >> NTL_NBITS) - _hi; \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* value shifted is 0..3 */
#define zam_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + _a + _t; \
_hi--; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
}
/* value shifted is 0..2 */
#define zsx_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + _t; \
_hi--; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
}
/* value shifted is 0..3 */
#define zam_subfinish(a,t) \
{ \
long _a = (a), _t = (t); \
_hi += 2; \
_lo = _a + _t - _lo; \
(t) = (((unsigned long)(_lo + (_hi<<NTL_NBITS))) >> NTL_NBITS) - _hi; \
(a) = _lo & NTL_RADIXM; \
}
#else
/* clean int version */
/* value right-shifted is 0..2 */
#define zaddmulp(a, b, d, t) \
{ \
long _a = (a), _b = (b), _d = (d), _t = (t); \
unsigned long _t1 = ((unsigned long) _b)*((unsigned long) _d); \
unsigned long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ) - 1; \
_t2 = _t2 + ( (_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS ); \
_t1 = (_t1 & NTL_RADIXM) + ((unsigned long) _a) + ((unsigned long) _t); \
(t) = (long) (_t2 + (_t1 >> NTL_NBITS)); \
(a) = (long) (_t1 & NTL_RADIXM); \
}
#define zxmulp(a, b, d, t) \
{ \
long _b = (b), _d = (d), _t = (t); \
unsigned long _t1 = ((unsigned long) _b)*((unsigned long) _d) + ((unsigned long) _t); \
unsigned long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ) - 1; \
(t) = (long) (_t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_t1 & NTL_RADIXM); \
}
/* value shifted is 0..2 */
#define zaddmulpsq(a, b, t) \
{ \
long _a = (a), _b = (b); \
unsigned long _t1 = ((unsigned long) _b)*((unsigned long) _b); \
unsigned long _t2 = (long) ( ((double) _b)*(((double) _b)*NTL_FRADIX_INV) ) - 1; \
_t2 = _t2 + ( (_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS ); \
_t1 = (_t1 & NTL_RADIXM) + ((unsigned long) _a); \
(t) = (long) (_t2 + (_t1 >> NTL_NBITS)); \
(a) = (long) (_t1 & NTL_RADIXM); \
}
#define zam_decl double _ds; long _s; unsigned long _hi, _lo;
#define zam_init(b,s) \
{ \
long _b = (b); \
_s = (s); \
_ds = ((_s << 1)+1)*(NTL_FRADIX_INV/2.0); \
_lo = ((unsigned long) _b)*((unsigned long) _s); \
_hi = (long) (((double) _b)*_ds); \
}
/* value shifted is 0..3 */
#define zam_loop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
unsigned long _vv; \
double _yy; \
_vv = ((unsigned long) _nb)*((unsigned long)_s); \
_yy = ((double) _nb)*_ds; \
_lo = _lo + ((unsigned long) _a) + ((unsigned long) _t); \
_hi--; \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
_lo = _vv; \
_hi = (long) _yy; \
}
/* value shifted is 0..2 */
#define zsx_loop(a,t,nb) \
{ \
long _t = (t), _nb = (nb); \
unsigned long _vv; \
double _yy; \
_vv = ((unsigned long) _nb)*((unsigned long) _s); \
_yy = ((double) _nb)*_ds; \
_lo = _lo + ((unsigned long) _t); \
_hi--; \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
_lo = _vv; \
_hi = (long) _yy; \
}
/* value shifted is 0..3 */
#define zam_subloop(a,t,nb) \
{ \
long _a = (a); unsigned long _t = (t); long _nb = (nb); \
unsigned long _vv; \
double _yy; \
_vv = ((unsigned long) _nb)*((unsigned long) _s); \
_yy = ((double) _nb)*_ds; \
_hi += 2; \
_lo = ((unsigned long) _a) + _t - _lo; \
(t) = ((_lo + (_hi<<NTL_NBITS)) >> NTL_NBITS) - _hi; \
(a) = (long) (_lo & NTL_RADIXM); \
_lo = _vv; \
_hi = (long) _yy; \
}
/* value shifted is 0..3 */
#define zam_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + ((unsigned long) _a) + ((unsigned long) _t); \
_hi--; \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
}
/* value shifted is 0..2 */
#define zsx_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + ((unsigned long) _t); \
_hi--; \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
}
/* value shifted is 0..3 */
#define zam_subfinish(a,t) \
{ \
long _a = (a); unsigned long _t = (t); \
_hi += 2; \
_lo = ((unsigned long) _a) + _t - _lo; \
(t) = ((_lo + (_hi<<NTL_NBITS)) >> NTL_NBITS) - _hi; \
(a) = (long) (_lo & NTL_RADIXM); \
}
#endif
/* end of arithmemtic-right-shift if-then else */
#else
/* NTL_BITS_PER_LONG > NTL_NBITS + 2, and certain optimizations can be
made. Useful on 64-bit machines. */
#if (NTL_ARITH_RIGHT_SHIFT && !defined(NTL_CLEAN_INT))
/* shift is -1..+3 */
#define zaddmulp(a, b, d, t) \
{ \
long _a = (a), _b = (b), _d = (d), _t = (t); \
long _t1 = _b*_d + _a + _t; \
long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ); \
(t) = _t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS); \
(a) = _t1 & NTL_RADIXM; \
}
#define zxmulp(a, b, d, t) \
{ \
long _b = (b), _d = (d), _t = (t); \
long _t1 = _b*_d + _t; \
long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ); \
(t) = _t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS); \
(a) = _t1 & NTL_RADIXM; \
}
/* shift is -1..+2 */
#define zaddmulpsq(a, b, t) \
{ \
long _a = (a), _b = (b), _t = (t); \
long _t1 = _b*_b + _a; \
long _t2 = (long) ( ((double) _b)*(((double) _b)*NTL_FRADIX_INV) ); \
(t) = _t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS); \
(a) = _t1 & NTL_RADIXM; \
}
#define zam_decl double _ds; long _hi, _lo, _s;
#define zam_init(b,s) \
{ \
long _b = (b); \
_s = (s); \
_ds = _s*NTL_FRADIX_INV; \
_lo = _b*_s; \
_hi = (long) (((double) _b)*_ds); \
}
/* shift is -1..+3 */
#define zam_loop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_lo = _lo + _a + _t; \
(t) = _hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is -1..+2 */
#define zsx_loop(a,t,nb) \
{ \
long _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_lo = _lo + _t; \
(t) = _hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is -3..+1 */
#define zam_subloop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_lo = _a + _t - _lo; \
(t) = ((_lo + (_hi<<NTL_NBITS)) >> NTL_NBITS) - _hi; \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is -1..+3 */
#define zam_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + _a + _t; \
(t) = _hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
}
/* shift is -1..+2 */
#define zsx_finish(a,t) \
{ \
long _t = (t); \
_lo = _lo + _t; \
(t) = _hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
}
/* shift is -3..+1 */
#define zam_subfinish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _a + _t - _lo; \
(t) = ((_lo + (_hi<<NTL_NBITS)) >> NTL_NBITS) - _hi; \
(a) = _lo & NTL_RADIXM; \
}
#elif (!defined(NTL_CLEAN_INT))
/* right shift is not arithmetic */
/* shift is 0..4 */
#define zaddmulp(a, b, d, t) \
{ \
long _a = (a), _b = (b), _d = (d), _t = (t); \
long _t1 = _b*_d + _a + _t; \
long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ) - 1; \
(t) = _t2 + (((unsigned long)(_t1 - (_t2 << NTL_NBITS))) >> NTL_NBITS); \
(a) = _t1 & NTL_RADIXM; \
}
#define zxmulp(a, b, d, t) \
{ \
long _b = (b), _d = (d), _t = (t); \
long _t1 = _b*_d + _t; \
long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ) - 1; \
(t) = _t2 + (((unsigned long)(_t1 - (_t2 << NTL_NBITS))) >> NTL_NBITS); \
(a) = _t1 & NTL_RADIXM; \
}
/* shift is 0..3 */
#define zaddmulpsq(a, b, t) \
{ \
long _a = (a), _b = (b), _t = (t); \
long _t1 = _b*_b + _a; \
long _t2 = (long) ( ((double) _b)*(((double) _b)*NTL_FRADIX_INV) ) - 1; \
(t) = _t2 + (((unsigned long)(_t1 - (_t2 << NTL_NBITS))) >> NTL_NBITS); \
(a) = _t1 & NTL_RADIXM; \
}
#define zam_decl double _ds; long _hi, _lo, _s;
#define zam_init(b,s) \
{ \
long _b = (b); \
_s = (s); \
_ds = _s*NTL_FRADIX_INV; \
_lo = _b*_s; \
_hi = (long) (((double) _b)*_ds); \
}
/* shift is 0..4 */
#define zam_loop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_hi--; \
_lo = _lo + _a + _t; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is 0..3 */
#define zsx_loop(a,t,nb) \
{ \
long _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_hi--; \
_lo = _lo + _t; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is 0..4 */
#define zam_subloop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
long _vv; \
double _yy; \
_vv = _nb*_s; \
_yy = ((double) _nb)*_ds; \
_hi += 3; \
_lo = _a + _t - _lo; \
(t) = (((unsigned long)(_lo + (_hi<<NTL_NBITS))) >> NTL_NBITS) - _hi; \
(a) = _lo & NTL_RADIXM; \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is 0..4 */
#define zam_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + _a + _t; \
_hi--; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
}
/* shift is 0..3 */
#define zsx_finish(a,t) \
{ \
long _t = (t); \
_lo = _lo + _t; \
_hi--; \
(t) = _hi + (((unsigned long)(_lo - (_hi<<NTL_NBITS))) >> NTL_NBITS); \
(a) = _lo & NTL_RADIXM; \
}
/* shift is 0..4 */
#define zam_subfinish(a,t) \
{ \
long _a = (a), _t = (t); \
_hi += 3; \
_lo = _a + _t - _lo; \
(t) = (((unsigned long)(_lo + (_hi<<NTL_NBITS))) >> NTL_NBITS) - _hi; \
(a) = _lo & NTL_RADIXM; \
}
#else
/* clean int version */
/* shift is 0..4 */
#define zaddmulp(a, b, d, t) \
{ \
long _a = (a), _b = (b), _d = (d), _t = (t); \
unsigned long _t1 = ((unsigned long) _b)*((unsigned long) _d) + ((unsigned long) _a) + ((unsigned long) _t); \
unsigned long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ) - 1; \
(t) = (long) (_t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_t1 & NTL_RADIXM); \
}
#define zxmulp(a, b, d, t) \
{ \
long _b = (b), _d = (d), _t = (t); \
unsigned long _t1 = ((unsigned long) _b)*((unsigned long) _d) + ((unsigned long) _t); \
unsigned long _t2 = (long) ( ((double) _b)*(((double) _d)*NTL_FRADIX_INV) ) - 1; \
(t) = (long) (_t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_t1 & NTL_RADIXM); \
}
/* shift is 0..3 */
#define zaddmulpsq(a, b, t) \
{ \
long _a = (a), _b = (b), _t = (t); \
unsigned long _t1 = ((unsigned long) _b)*((unsigned long) _b) + ((unsigned long) _a); \
unsigned long _t2 = (long) ( ((double) _b)*(((double) _b)*NTL_FRADIX_INV) ) - 1; \
(t) = (long) (_t2 + ((_t1 - (_t2 << NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_t1 & NTL_RADIXM); \
}
#define zam_decl double _ds; long _s; unsigned long _hi, _lo;
#define zam_init(b,s) \
{ \
long _b = (b); \
_s = (s); \
_ds = _s*NTL_FRADIX_INV; \
_lo = ((unsigned long) _b)*((unsigned long) _s); \
_hi = (long) (((double) _b)*_ds); \
}
/* shift is 0..4 */
#define zam_loop(a,t,nb) \
{ \
long _a = (a), _t = (t), _nb = (nb); \
unsigned long _vv; \
double _yy; \
_vv = ((unsigned long) _nb)*((unsigned long) _s); \
_yy = ((double) _nb)*_ds; \
_hi--; \
_lo = _lo + ((unsigned long) _a) + ((unsigned long) _t); \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is 0..3 */
#define zsx_loop(a,t,nb) \
{ \
long _t = (t), _nb = (nb); \
unsigned long _vv; \
double _yy; \
_vv = ((unsigned long) _nb)*((unsigned long) _s); \
_yy = ((double) _nb)*_ds; \
_hi--; \
_lo = _lo + ((unsigned long) _t); \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is 0..4 */
#define zam_subloop(a,t,nb) \
{ \
long _a = (a); unsigned long _t = (t); long _nb = (nb); \
unsigned long _vv; \
double _yy; \
_vv = ((unsigned long) _nb)*((unsigned long) _s); \
_yy = ((double) _nb)*_ds; \
_hi += 3; \
_lo = ((unsigned long) _a) + _t - _lo; \
(t) = ((_lo + (_hi<<NTL_NBITS)) >> NTL_NBITS) - _hi; \
(a) = (long) (_lo & NTL_RADIXM); \
_lo = _vv; \
_hi = (long) _yy; \
}
/* shift is 0..4 */
#define zam_finish(a,t) \
{ \
long _a = (a), _t = (t); \
_lo = _lo + ((unsigned long) _a) + ((unsigned long) _t); \
_hi--; \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = _lo & NTL_RADIXM; \
}
/* shift is 0..3 */
#define zsx_finish(a,t) \
{ \
long _t = (t); \
_lo = _lo + ((unsigned long) _t); \
_hi--; \
(t) = (long) (_hi + ((_lo - (_hi<<NTL_NBITS)) >> NTL_NBITS)); \
(a) = (long) (_lo & NTL_RADIXM); \
}
/* shift is 0..4 */
#define zam_subfinish(a,t) \
{ \
long _a = (a); unsigned long _t = (t); \
_hi += 3; \
_lo = ((unsigned long) _a) + _t - _lo; \
(t) = ((_lo + (_hi<<NTL_NBITS)) >> NTL_NBITS) - _hi; \
(a) = (long) (_lo & NTL_RADIXM); \
}
#endif
/* end of arithmetic-right-shift if-then-else */
#endif
/* end of "NTL_BITS_PER_LONG <= NTL_NBITS + 2" if-then-else */
#endif
/* end of long-integer-implementation if-then-else */
static
void zaddmulone(long *lama, long *lamb)
{
long lami;
long lams = 0;
lams = 0;
for (lami = (*lamb++); lami > 0; lami--) {
lams += (*lama + *lamb++);
*lama++ = lams & NTL_RADIXM;
lams >>= NTL_NBITS;
}
*lama += lams;
}
#if (NTL_ARITH_RIGHT_SHIFT && !defined(NTL_CLEAN_INT))
static
void zsubmulone(long *lama, long *lamb)
{
long lami;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -