OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

mの平方根の連分数展開なのですがうまく動きません。

  • 困ってます
  • 質問No.102061
  • 閲覧数411
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 45% (26/57)

subroutine keisan(m)
integer a,a0,n,i,m
real t,X,Y,Z
t=sqrt(real(m))
a0=int(t)
write(*,*) 'a0=',a0
a=a0
X=1
Y=0
Z=1
do 10 n=1,20
if (Z==0.0) exit
X=X*Z
Y=Z*(-Y+real(a)*Z)
Z=X*X*real(m)-(real(a)*Z-Y)**2
do 100 i=1,X
if(real(i)==X) then
X=X
else
if(((mod(int(X),i))==0).AND.((mod(int(Y),i))==0).AND.((mod(int(Z),i))==0)) then
X=X/real(i)
Y=Y/real(i)
Z=Z/real(i)
else
X=X
endif
endif
100 continue
a=int((X*t+Y)/Z)
write(*,*) 'a',n,'=',a
10 continue
end subroutine
サブルーチンのみ載せてますけど・・・・どうなのでしょう??
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

なんで、こんな難しくなるの?

一番単純な形だと、

        1
√m = a1 + ──
        X

で、a1 は、√mの整数部。で、この X は、√m-a1 の逆数で、
それを又、この形にしてゆく、の繰返しでしょ。

   subroutine keisan(m)

   integer i,m,a;
   double x;
  
   x = sqrt(real(m))
   a = int(x);
  
   write(*,*) 'a=',a
  
   do 10 i = 1, 20
    if (x .eq. a) return;
    x = 1.0 / (x - a)
    a = int(x)
    write(*,*) 'a=',a
 10 continue

   return
   end

# fortran は、ずいぶん久しぶりなので、文法間違いがあったらごめんなさい
補足コメント
chikako-imagawa

お礼率 45% (26/57)

ありがとうございます・・・でも、「誤差なく」値を出せということだったんでこんなに複雑になったんです。
ヒントとして“X=(X+Y√m)/Zのカタチで書けることが帰納法で証明出来る”というのがあったんで・・・・・
投稿日時 - 2001-07-11 12:35:36
お礼コメント
chikako-imagawa

お礼率 45% (26/57)

無事にプログラム完成致しました。ありがとうございました♪
投稿日時 - 2001-07-12 17:06:30
-PR-
-PR-
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ