関数 | |
size_t | ymp_rshiftabs (digit_t *result, const digit_t *source, size_t len, size_t width) |
多倍長の自然数に対し、右に向かってビットシフトを行なう。. より詳しく... | |
size_t | ymp_lshiftabs (digit_t *result, const digit_t *source, size_t len, size_t width) |
多倍長の自然数に対し、左に向かってビットシフトを行なう。. より詳しく... | |
size_t | ymp_modabs_2exp (digit_t *result, const digit_t *self, size_t len, size_t pow) |
多倍長自然数の2の冪乗による剰余. より詳しく... |
|
多倍長の自然数に対し、右に向かってビットシフトを行なう。. 溢れた分は切り捨てられる。
00035 { 00036 register size_t i; 00037 size_t n_digits = width / DIGIT_BIT; 00038 size_t n_bits = width % DIGIT_BIT; 00039 digit_t prev; 00040 00041 if (len <= n_digits) return 0; 00042 00043 i=len; prev=0; 00044 while (i-- > n_digits) 00045 { 00046 double_digit_t tmp = LOW_DIGIT_TO_HIGH_DIGIT((double_digit_t)prev); 00047 prev = source[i]; 00048 tmp += source[i]; 00049 result[i-n_digits] = LOW_DIGIT(tmp >> n_bits); 00050 } 00051 00052 00053 /* 要素数の調整 */ 00054 len -= n_digits; /* 今、len > n_digits */ 00055 if (result[len-1]==0) --len; 00056 00057 return len; 00058 } |
|
多倍長の自然数に対し、左に向かってビットシフトを行なう。. 右側は0で埋められる。
00077 { 00078 register size_t i; 00079 size_t n_digits = width / DIGIT_BIT; 00080 size_t n_bits = width % DIGIT_BIT; 00081 double_digit_t tmp; 00082 00083 if (len == 0) return 0; 00084 00085 i = len; tmp = source[--i]; 00086 tmp <<= n_bits; 00087 if (HIGH_DIGIT(tmp)) result[len++ + n_digits] = HIGH_DIGIT(tmp); 00088 00089 tmp = source[i]; 00090 while (i-- > 0) 00091 { 00092 tmp = LOW_DIGIT_TO_HIGH_DIGIT(tmp); 00093 tmp += source[i]; 00094 result[i+n_digits+1] = HIGH_DIGIT(tmp << n_bits); 00095 tmp = source[i]; 00096 } 00097 result[n_digits] = source[0] << n_bits; 00098 00099 i = n_digits; 00100 while (i-- > 0) result[i] = 0; 00101 00102 return len + n_digits; 00103 } |
|
多倍長自然数の2の冪乗による剰余. <self>を2のpow乗で割った剰余をresultに格納する。
呼出 ymp_mod_2exp, と ymp_modpowabs_2exp_z.
00121 { 00122 size_t n_digits = pow / DIGIT_BIT; 00123 size_t n_bits = pow % DIGIT_BIT; 00124 00125 if (n_digits < len) 00126 { 00127 len = n_digits; 00128 if (n_bits) 00129 { 00130 result[n_digits] = self[n_digits] & ( (1u << n_bits) - 1u ); 00131 ++n_digits; 00132 } 00133 } 00134 else if (n_digits > len) 00135 { 00136 n_digits = len; 00137 } 00138 00139 if (result != self) memcpy(result, self, len*sizeof(digit_t)); 00140 00141 while (n_digits-- > 0) 00142 { 00143 if (self[n_digits] != 0) break; 00144 } 00145 return n_digits+1; 00146 } |