こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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
サブルーチンのみ載せてますけど・・・・どうなのでしょう??

投稿日時 - 2001-07-10 09:10:46

QNo.102061

困ってます

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

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

一番単純な形だと、

        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 は、ずいぶん久しぶりなので、文法間違いがあったらごめんなさい

投稿日時 - 2001-07-10 10:55:18

補足

ありがとうございます・・・でも、「誤差なく」値を出せということだったんでこんなに複雑になったんです。
ヒントとして“X=(X+Y√m)/Zのカタチで書けることが帰納法で証明出来る”というのがあったんで・・・・・

投稿日時 - 2001-07-11 12:35:36

お礼

無事にプログラム完成致しました。ありがとうございました♪

投稿日時 - 2001-07-12 17:06:30

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問