多倍長演算ライブラリ ルーチン18



[ 簡単な説明 ]

法 n における逆数を求めます。アルゴリズムはユークリッドの互除法です。
数 x に関して、(x × y) mod n=1 となる y を、x の法 n における逆数と言います。
例えば、5の法11における逆数は9です。((5×9)mod11=1)
x と n が互いに素である(共通因数をもたないこと、必ずしも素数である必要はない)ならば、y は唯一つ存在します。
(注:上記の例では、(5×20)mod11=1 も成立しますが、法11のもとでは、数値は0〜10の有限の世界であり、20もまた法11のもとでは=9となります。(20mod11=9)


プログラム・ソース("linv.c")           top (トップに戻る)
/*		linv.c		*/
#include "longint.h"

/* GCD(s, n) = 1  :  s * x = 1 (mod n) */

LINT linv(LINT s, LINT n)
{
	LINT q, t, u, v, w;

	t = n;
	u = lset(1);
	v.len = 0;
	while(s.len > 0)
	{
		q = ldivide(t, s, &w);
		t = s;
		s = w;
		w = lmul(q, u);
		w = lsub(v, w);
		v = u;
		u = w;
	}
	if(v.sign == -1)	v = ladd(v, n);
	return v;
}