メインページ   モジュール   データ構造   ファイル一覧   データフィールド   グローバル  

下位関数群
[ビット演算]


関数

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の冪乗による剰余. より詳しく...


関数の解説

size_t ymp_rshiftabs digit_t   result,
const digit_t   source,
size_t    len,
size_t    width
 

多倍長の自然数に対し、右に向かってビットシフトを行なう。.

溢れた分は切り捨てられる。

引数:
result  結果を格納するdigit_tの配列の先頭へのポインタ
source  元のdigit_tの列の先頭へのポインタ
len  sourceがポイントする列の要素数
width  シフトのビット幅
事前条件:
resultのポイントする領域は十分な大きさであること。
覚え書き:
resultのポイントする領域は多くともMAX(0, len-width/DIGIT_BIT)個の 要素を格納できれば十分である。
resultとsourceは一致してもよい
戻り値:
resultに格納された要素数

shift.c34 行で定義されています。

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 }

size_t ymp_lshiftabs digit_t   result,
const digit_t   source,
size_t    len,
size_t    width
 

多倍長の自然数に対し、左に向かってビットシフトを行なう。.

右側は0で埋められる。

引数:
result  結果を格納するdigit_tの配列の先頭へのポインタ
source  元のdigit_tの列の先頭へのポインタ
len  sourceがポイントする列の要素数
width  シフトのビット幅
事前条件:
resultのポイントする領域は十分な大きさがあること
覚え書き:
resultのポイントする領域は多くとも(len+width/DIGIT_BIT+1)個の要素を 格納できれば十分である。
resultとsourceは一致してもよい
戻り値:
resultに格納された要素数 長さ0の列に対してはシフトを行わずに単に0を返す。

shift.c76 行で定義されています。

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 }

size_t ymp_modabs_2exp digit_t   result,
const digit_t   self,
size_t    len,
size_t    pow
 

多倍長自然数の2の冪乗による剰余.

<self>を2のpow乗で割った剰余をresultに格納する。

引数:
result  剰余を格納するdigit_tの列の先頭へのポインタ
self  元の数を表すdigit_tの列の先頭へのポインタ
len  selfのポイントする領域の長さ(要素数)
pow  冪指数
事前条件:
resultは pow / DIGIT_BIT + (powDIGIT_BIT)?1:0個の要素を格納できること
戻り値:
resultに格納された要素数
覚え書き:
selfとresultは一致してもよい
格納領域の長さは最大でも pow / DIGIT_BIT + 1 あれば十分

shift.c120 行で定義されています。

参照 DIGIT_BIT, と digit_t.

呼出 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 }


YMPに対してTue Mar 16 19:23:52 2004に生成されました。 doxygen1.2.14 作者 Dimitri van Heesch, © 1997-2002