• ベストアンサー

ユークリッドの互助法って何でしょか?

学校の問題で、その方法を再帰呼び出しを持って実践するプログラムを作りなさい、と言うのが出て、そのまずユークリッドが分からないで八方塞がりingです。    余り知識が無いんで簡潔に説明して戴けたら、これ、幸いであります。 

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

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

簡潔に説明しましょう。 ユークリッド・・大昔の数学の大家。ユークリッド幾何学、非ユークリッド幾何学の名で有名。 ユークリッドの互除法・・2つの数の最大公約数を求めるのに、最も早い、すばらしい方法。互除法というのはお互いに除算(割り算)をすると言う意味。互助法ではありません。 [ユークリッドの互除法] (1)2つの数を、A、Bとします。仮にAが大きいとします。 (2)AをBで割って余りをRとします。 (3)Rが0なら、Bが答え(最大公約数)で終わり。 (4)BとRのうち大きいほうをAに入れ、小さいほうをBに入れます。 (5)前の(2)へ飛びます。 例をあげましょう。A=18、B=12とします。 R=mod(18,12)=6 A=12、B=6 R=mod(12,6)=0 → 終わり  B=6が答え(最大公約数) どうです。簡単でしょう。 割り算の代わりに引き算を繰り返し使う方法もあります(CASLなどでは) この問題で、再帰処理を使うメリットは感じませんが、練習として使う事は可能です。再帰処理は質問に入っていないので、省略します。過去にも再帰処理の質問は出ています。頑張ってください。

sonicgear
質問者

お礼

 ご回答どうも有り難う御座いました! ナカナカ分かり易かったです。 感謝です。   

その他の回答 (1)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

どもども田吾作7です。 再帰法で再起不能 ↑おっさんギャグ まぁそれはそれとして、 再帰法はわかりますか? 簡単な例題を出します。 50平方の画用紙を、ある裁断機に入れると半分の大きさになります。 1平方メートル以下の大きさになるには何回通るでしょう? VBではDO~LOOPを使う方法がありますが、再帰法で行うことも出来ます。 Option Explicit 'カット回数を表すカウンタ Private CutCount  As Long Public Sub Main()   'ペーパーのサイズ   Dim PaperSize  As Double      '基本の大きさ   PaperSize = 50      'カットした回数の初期値   CutCount = 0      '裁断機にかける   Call CutPaper(PaperSize)      MsgBox CutCount End Sub '裁断機 Private Sub CutPaper(inParper As Double)   '用紙サイズが1m2以下なら終了   If inParper < 1 Then Exit Sub      '用紙サイズが1m2以上であれば裁断機にかけるて自分自身を呼び出す   '(カウンタを増やし、自分自身を呼び出す)   inParper = inParper / 2   CutCount = CutCount + 1   Call CutPaper(inParper) End Sub このように条件を満たすまで、自分自身を呼び出すのが再帰法です。 例題があまりよくないので、これはDO~LOOPの方が好ましいかも知れません。 実際使用するとしたら、「あるフォルダ以下を全て書き込み禁止にしなさい」といった処理を行う時に、再帰法がベストだと思います。フォルダの中のファイルを書込み禁止にして、その中にフォルダが存在していたら、更にそのフォルダ内を書込み禁止にして・・・・とフォルダが存在する限り、その関数を走り続けるようになります。(サンプルはちょっと面倒なので勘弁して) この一つ目の例題と二つ目の大きな差は、同じレベルか、それとも下のレベルかという点にあります。 ペーパーはあくまで裁断されても、単に小さいペーパーであって、最初の50平方メートルのペーパーを指します。 しかしフォルダ内の書込み禁止は、フォルダの中のサブフォルダ、またはさらにその中のサブフォルダ・・・と階層があるわけです。 前置きが長くなりましたが、ユーグリッド法はわかりませんが、ユーグリッドの互助法はこの概念と共通してます。 「ある条件が満たされるまで、一つのパターンを繰り返して行く」 まさに再帰法です。 下記URLにユーグリッドの互助法による、最大公約数の求め方がありますので、そちらをのぞいてみては? そちらにも例題があります。 [a][b][r][r1]とか書いてありますが、例題の具体例を紙に書いてやってみると、同じこと繰り返しをしているだけで、結構単純であることに気付くと思いますよ。

参考URL:
http://math1.edu.mie-u.ac.jp/~motokioh/ucurid.htm
sonicgear
質問者

お礼

 ご回答有り難う御座います! 少し分かったような、分からないような・・・  勉強します!!

関連するQ&A

  • 再帰関数とユークリッドの互除法を用いて最大公約数を求める

    学校の課題で、再帰関数とユークリッドの互除法を用いて10~100000までの最大公約数を求めるという問題が出て自分でプログラムを作ってみたのですが無限ループに入ったり、関数が使えてないみたいでできません。プログラムを見て頂いて、どこを改善したらいいかを教えてください。 #include <stdio.h> /* 正整数 n, m の最大公約数を計算する */ int gcd(int n, int m) { int res; res = n % m; if (res == 0) return m; /* 最大公約数が求まった */ return gcd(m, res); /* 再帰呼び出し */ } int main(void) { int i,j; for(i=10000;i>=10;i--){ for(j=10;j=10000;j++){ printf("%d to %d no saidaikouyakusuu ha %d \n", i, j, gcd(i, j)); } } return (0); } です。期限が今日の夜までで、ぎりぎりなんですがよろしくお願いします。

  • 再帰呼びだし

    再帰呼びだし 問題1 再帰呼び出しを用いてint型の配列({-9、8、-7、6、5、4、1、3、6、9、2、-14})の最小値を求めて出力するプログラムを作成せよ。関数名はmin_of_arrayとする。 問題2 同じく再帰呼び出しを用いてint型の配列({3、4、1、5、2})を小さい方から順番に求めて出力するプログラムを作成せよ。 再帰呼び出しが苦手で、じっくり解いていこうと思ったのですが、他の課題もあって、もう提出期限いっぱいいっぱいなので載せました。 どうかよろしくお願いします。

  • ユークリッドの互助法

    ユークリッドの互助法を最初に知ったのはいつのことですか? なぜこんなことを聞くかというと、高校までに授業で習った記憶がないからです。 重要なので中学校くらいで習っててもおかしくないかなと。 学校によりけりなんでしょうか?

  • C++でforや再帰関数を使わずに、総当りする方法はありますか?

    C++等で、forを使わず、再帰関数を使わずに多量のループで総当りする方法はありますでしょうか? 自己末尾再帰関数というのがネットで出てきますが、C言語系では使えないみたいです。 再帰関数で変数を全てスタティックにしても、関数の多重呼び出しで容量を食ってプログラムが動かないほどの計算をこなす必要があるのですが、こういった多数の桁のやり方になれておらず、先が見えません… また、全部をforにするのも、桁が大きすぎて問題があります。 どなたかご教授くださいますと幸いです。

  • 再帰呼び出しを用いるnPk,nCk 計算プログラム作成

    javaで再帰呼び出しを用いるnPk,nCk計算プログラム作成したいです。 同じクラスでnPk,nCkを求める事です。 再帰呼び出しで nからkを求める事ができないです。ひとつだけなら できますがふたつを一緒に求める事ができません。 なんか方法がないでしょうか?お願いいたします。 結果は 引数nとk値で、 nPk、nCkの計算結果を出したいです。

  • 拡張ユークリッド互助法

    拡張ユークリッド互助法の使い方、ユークリッドの互助法からの導き方を教えてください。

  • 拡張ユークリッド互助法

    拡張ユークリッド互助法の使い方、ユークリッドの互助法からの導き方を教えてください

  • 基本情報技術者を受験できたら、と考えているのですが

    基本情報技術者を受験できたら、と考えているのですが こんにちは、2010年1月末のJava2級に合格し、 できれば、秋期の基本情報技術者の受験を目指して、教科書や、過去問に 取り組み始めた者です。 その過程において、わからないことが出てきましたので、質問させていただきます。 「プログラミング」の「プログラミングの特徴」についてですが、教科書には、 「再使用可能プログラム」「再入可能プログラム」「再配置可能プログラム」 「再帰呼び出し可能プログラム」が記載されていたのですが、 これらは、ソースコードの記述の仕方、と捉えても問題はないのでしょうか? 「再帰呼び出し可能プログラム」は、例えば「階乗の解を求める」というのが 対応するのでしょうか? 「再使用可能プログラム」の説明において、 プログラムは「実行中に初期設定値などを書き換えてしまうと、 もう一度ロードしなおしてから実行する」とあったのですが、 変数などの値が変わった場合、ということでしょうか? あるいは、さまざまなプログラミング言語を定義する側の人が、このような特徴を 取り入れる、ということでしょうか? それとも、最近のパソコンではどのような言語も、このような特徴を 備えているということでしょうか? まったく的外れな質問かも知れませんが、もしよろしければ教えていただけないでしょうか よろしくお願いします。

  • Mac10.6.3からのアップデート。

    現在使用中のMacは10.6.3です。少し前までは10.6.8だったのですが 「Mac os 統合アップデート」を推奨されていたので、アップデートを かけたら、するとなぜかsafariをクリックすると即エラーメッセージ(予期せぬ理由) という状態になりました。それでやむなく、再インストールでこの問題を 解消させたのですが、10.6.8が10.6.3に戻ってしまいました。 知識がないので、説明も分かりにくいかもしれませんが、ざっくりと申しますと 「10.6.3の現状から10.7にしたい」ということです。 方法はあるのでしょうか?こちらとして試みた事は、現状10.6.3なので10.6.4に まずはアップデートしてみようとしましたが、「出来ません」とのメッセージが 表示されてしまい八方塞がりでしす。 何とぞ、ご教授願います。

    • ベストアンサー
    • Mac
  • IT営業としての知識を身につけたい

    もともとITに詳しい方ではありませんでしたが、 やったことのないことができると感じ 全くの未経験からIT営業に転職して数か月経つのですが、 ITの知識がさっぱり身につきません。 IT用語も1つわからない単語を調べると、 また3つくらい分からない言葉で説明されます。イメージも湧きません。 お客さん(技術者)に聞かれる質問(サーバーやらセキュリティやら)にも答えられないことが多く、 勉強のために始めたwordpressも、進めるにつれ分からないことばかりで 八方ふさがりです。 何かこういった知識を初歩からきちんと学べる方法や サイトなどがあればとても知りたいです。 よろしくお願いします。

専門家に質問してみよう