• ベストアンサー

ユークリッドの互徐法

p と q は素数とします。 1=gcd(e,(p-1)(q-1)) を満たす最小のe(e>1)はどうやって出せばいいですか。 まだユークリッドの互徐法の使い方に慣れていないので、どうやればいいかわかりません^^; たとえば、p=5 q=7のときどうすればいいでしょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

#1のご回答の通りと思いますが、 ●gcd(e,b)=1 とはどういう意味かつーと、「eとbを共に割り切るような自然数は1しかない」ということであり、つまり「eとbが互いに素」て意味です。だからご質問の問題は「b=(p-1)(q-1)のとき、eとbが互いに素であるような最小のeは何か?」です。 ●ここで、eは素数である。なぜなら、もし「eとbが互いに素であるような最小のe」が合成数であって e = st (s,t>1) と分解できるとすると、eより小さいsについて「sとbが互いに素」であるから、eは「eとbが互いに素であるような最小のe」ではなかった事になるからです。 ●さて、bを素因数分解したものを以下のように表してみましょう。 n番目の素数をP[n]と書くことにし、 b=(P[1]^k[1])(P[2]^k[2])...(P[N]^k[N])(ただしk[n]≧0) そうしますと、k[n]=0であるような最小のnを見つければ、P[n]はbの素因数として含まれていない最小の素数である。だから、 gcd(P[n],b)=1 であり、しかもP[n]はgcd(e,b)=1を満たすeの内で最小である。 ●という訳で、問題は 「bの素因数として含まれていない最小の素数は何か?」 ということに帰着します。 すなわち、bを素数P[1]=2,P[2]=3,P[3]=5,...で順番に割ってみる、というテストをやって、初めて見つかった割り切れないやつが、eってことです。プログラム風に書くと: n:=1 loop  r:=b÷P[n]を計算する。  if (b÷P[n]が割り切れなかったら) then P[n]が答である。(終わり)  n:=n+1 end loop 「最悪」の場合は b=(P[1]^k[1])(P[2]^k[2])...(P[N]^k[N]) , (n=1,2,...,Nについてk[n]>0) という場合で、このとき「gcd(e,b)=1となる最小のe」は P[N+1]になります。ご質問の例に挙げられたのは b=24 で、これはたまたま、この「最悪」の場合に該当します。 ●さて、bがP[m]で割り切れたとしましょう。すると、以後、bの代わりに(b/P[m])をテストしても良い。割り切れると分かったら実際に割っておけば、(特にbが何万桁もあるような時には)計算が楽になりそうです。 n:=1 loop  r:=b÷P[n]を計算する。  if (b÷P[n]が割り切れなかったら) then   P[n]が答である。(終わり)  else   repeat    b:=r;    r:=b÷P[n]を計算する。   until b÷P[n]が割り切れない   n:=n+1  end if end loop ●ところで、ご質問では b=(p-1)(q-1) だから、bが合成数であるばかりか、(p-1)も(q-1)も合成数です。ゆえに、「(p-1)の素因数にも(q-1)の素因数にも含まれない最小の素数eは何か」という問題を解けば良い。ということは、(p-1)と(q-1)を素数P[1]=2,P[2]=3,P[3]=5,...で順番に割ってみて、初めて見つかった「どっちも割り切れないやつ」が、eってことです。 x:=p-1 y:=q-1 n:=1 loop  r:=x÷P[n]を計算する。  s:=y÷P[n]を計算する。  if (x÷P[n]が割り切れず、しかもy÷P[n]が割り切れなかったら) then P[n]が答である。(終わり)  n:=n+1 end loop もちろんこの場合も、割り切れると分かったら実際に割っておく、という手を組み込むことができます。 x:=p-1 y:=q-1 n:=1 loop  r:=x÷P[n]を計算する。  s:=y÷P[n]を計算する。  if (x÷P[n]が割り切れず、しかもy÷P[n]が割り切れなかったら) then   P[n]が答である。(終わり)  else   while (x÷P[n]が割り切れる)    x:=r;    r:=y÷P[n]を計算する。   end while   while (y÷P[n]が割り切れる)    y:=s;    s:=y÷P[n]を計算する。   end while  end if  n:=n+1 end loop ●質問のご真意を読みかねるところもある気がするので、「自信なし」です。

arcsin
質問者

お礼

ありがとうございます。簡単に言えば最大公約数をもとめるものだったんですね・・・ 暗号化理論という分野の問題だったのですが、授業でやったときは、 gcd(x,y)=sa+tb (∃s,t) に分解するようなa,bがある。 という説明をうけたものですから、「互いに素」という概念に気づきませんでした。 あとは大丈夫そうです。 ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#24477
noname#24477
回答No.1

元の問題はどんな問題でしょう? 互除法を使えという問題ですか? 最大公約数が1ということなので p-1とq-1を素因数に分解しておいて そこに含まれない最小の素数を考えればいいと思いますが。 p=5,q=7のとき(p-1)(q-1)=4*6=2^3*3 だからe=5とすればよい。 私が問題を勘違いしているかもしれないので 自信なしにしておきます。 追記 ゴジョホウの漢字に気をつけてください。

arcsin
質問者

お礼

なるほど、ありがとうござます。 字の方は今後気をつけます^^;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ユークリッド互除法

    29441と32934の最大公約数をユークリッド互除法で求めて答えが1とでました。さらに最小公倍数を求めろとあるのですが、ユークリッド法でどうやって最小公約数を求めるのですか?

  • ユークリッドの互除法

    ユークリッドの互除法がよくわかりません。 m>nとして(m=nならばm=gcd(m,n)) m=sn+t (n>t)とあらわせる。 ここでgcd(m,n)=gcd(n,t)となるのがわかりません。 これがわかったらあとはあまり部分が0になるまでやればそのときに最大公約数が出るというのはわかるのですが、、、

  • 拡張ユークリッド互除法について

    大学で習ったのですが、いまいちピンとこないので教えてください。 例えば ax = 1 mod n みたいな場合、xがaの逆元になるのでしょうが、逆元を持つ条件として gcd(a,n)=1である必要があると思います。 法nがn=pq(p,qは素数)みたいな合成数でも、逆元はある時はありますよね? aとnが互いに素であればいいのだから… それとも法は素数じゃないとダメなんでしょうか? 私の解釈は間違ってますか?

  • ユークリッドの互除法

    ユークリッドの互除法をJavascriptで書こうとしてます。以下のように書いたのですが、うまく動きません。(45と60の最大公約数を求めるプログラム) <script> window.alert(gcd(45, 60)); function gcd(a, b){ var r=a%b; if(r==0){ return b; }else{ gcd(b, r); } } </script> undifinedとなってしまいます。どうしたら正確な答えが出るでしょうか?

  • ユークリッドの互除法

    ユークリッドの互除法の処方でつまづいています。 どなたか教えて頂けませんか。 aとbは正の整数でb≦aの関係にある。 aとbの最大公約数gcd(a,b)。 この時gcd(a,b)=ax+byの解となる(x,y)のペアはいくついるのでしょうか? 直感ですと(x,y)は一つしか存在しないように感じるのですが、どうやって記述すればいいのでしょうか? よろしくお願いします。

  • ユークリッドの素数無限の証明を教えて

    ユークリッドの素数無限の証明で分からないところがあります。 とりあえずWikipwdiaから引用します。 素数が無数に存在することの証明 - Wikipedia https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E3%81%8C%E7%84%A1%E6%95%B0%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E8%A8%BC%E6%98%8E a, b, …, k を任意に与えられた素数のリストとする。その最小公倍数 P := a × b × ⋯ × k に 1 を加えた数 P + 1 は、素数であるか、合成数かのいずれかである。素数であれば、最初のリストに含まれない素数が得られたことになる。 素数でなければ、何らかの素数 p で割り切れるが、p はやはり最初のリストに含まれない。なぜならば、リスト中の素数は P を割り切るので、P + 1 を割り切ることは不可能だからである。任意の素数のリストから、リストに含まれない新たな素数が得られるので、素数は無数に存在する。 ---- 引用ここまで ---- 前半はわかります。後半の「リスト中の素数は P を割り切るので、P + 1 を割り切ることは不可能」の部分がどうもわかりません。 「リスト中の素数は P を割り切る」のは当然ですが、だとするとなぜ「P + 1 を割り切ることは不可能」になるのかつながりませんでした。 なぜ「P + 1 を割り切ることは不可能」なのでしょうか? この点について教えてください。 よろしくお願いします。

  • 三次元ユークリッド空間上の3点について

    三次元ユークリッド空間 E^3 上の相異なる3点をP, Q, Rとする時, (1): 3点,P, Q, R ∈ E^3 が直線上に存在しないための必要十分条件は,     どのように表現できるでしょうか? または, (2): 3点,P, Q, R ∈ E^3 が直線上に存在するための必要十分条件は,     どのように表現できるでしょうか? もし,(1)と(2)の両方が得られれば,このうえもなく有り難いですが, どちらか一方でも,いいので,教えて下さい.

  • 倍数の問題

    次の問題は小学校5・6年の参考書に載ってあったのですが、この問題を見て疑問に思ったことがあります。 【問題】12,18のどちらで割っても3余る数のうち、最も小さい整数を求めなさい。 この問題は、どちらで割っても余りが同じになるので、最小公倍数をgcd(a,b)で表すとすると、  gcd(12,18)+3=39 で解けるのですが、 (割ると3余るということは、割られる数は割る数の倍数より3大きいということになるから。) 余る数が違ったらどうやって解くんだ!!という疑問が生まれてしまいました。 問題にしてみると、次のようになります。 【問題】aで割ると余りがpになり,bで割ると余りがqになる数のうち、n番目の整数を求めよ。 ただし、最小公倍数をgcd(a,b)で表すものとする。 条件を満たす整数を1番目に限定しないようにしました。 これがp=q=rなら、gcd(a,b)n+rで簡単に求められるのですが、上のように余りが異なる場合はどうやって求めれば良いのでしょうか?

  • ユークリッドの除去法アルゴリズム

    最大公約数を求める際ユークリッドの除去法を使ったアルゴリズムを考える場合、計算量はO(log max{x,y})となる理由を教えて下さい。 簡単な擬似コードも教えてもらえるとありがたいです。

  • pとqが互いに異なる

    pとqが互いに異なる素数のとき、pとqは互いに素でしょうか。