From: "正木 功" Date: 2001-03-02T16:19:18+09:00 Subject: [ruby-list:28415] class Real $B@5LZ$G$9!#(B $B86(B $B?.0lO:MM!"8fJV?.M-Fq$&$4$6$$$^$9!#(B $BJ8;z2=$1<:Ni$7$^$7$?!#860x$,$o$+$i$J$$$N$G$3$N(B mail$B$b(B $BJ8;z2=$1 (B$7$J$$$+?4G[$G$9!#(B >$B?t3X$,$+$i$s$G$/$k$*OC$J$i@'Hs(B ruby-math $B$X$*1[$7$/$@$5$$!#(B $B$B%V%m%C%/$r4X?t$N%*%V%8%'%/%H2=$@$H;W$C$F;H$&$H!"$3$3$,5$;}$A0-$$$G$9$M!#( B >3N$+$K$=$NDL$j$G$9!#$3$l$K$D$$$F$O$3$N(B ML $B$G$b2?EY$+OCBj$K$J$C$?$H;W $(B >$B$^$9!#(B initialize $B$KM?$($i$l$?(B block $B$,8F$P$l$?$H$3$m$N(B context $B$G(B $BI>2A$5$l$J$$$H:$$k$H$$$C$?(B case $B$O$[$H$s$IL5$$$H;W$$$^$9!#(B initialize $B$KM?$($i$l$?(B block $B$O$=$N(B instance $B$N(B context $ B$G(B $BI>2A$5$l$k$Y$-$@$H;W$C$?$N$G(B instance_eval $B$O$=$N$?$a$N$b$N$@$H(B $B;W$C$F$$$^$7$?!#(B >$B$3$l$O(B Prime*Power[2] $B$,(B p $B$N0z?t$H2r$B$N(B p.75 $B$K$b>/$72r@b$7$^$7$?$,!#!K(B p() $B$NLa$jCM(B nil $B$K( B [] $,;\$5$l$F(B >$B$$$^$9!#(B $B$3$l$O$J$s$I$b0z$C$+$+$C$?f+$J$N$GCm0U$7$F$O$$$?$s$G$9$,!#(B $BBh(B2$B0z?t$NI,MW@-$,L5$/$J$l$P$+$J$j4JC1$K$J$j$^$9!#(B $BAjCL$7$F$h$+$C$?$H;W$$$^$9!#$"$j$,$H$&$4$6$$$^$7$?!#(B >$BFCDj$N?t$rI=8=$9$k(B Cauchy $BNs$r:n$k$3$H$O$G$-$k$G$7$g$&$,!"0lHL$K$O( B >Nc$($P$"$k?tNs$,(B Cauchy $BNs$G$"$k$+H]$+$rEz$($k=R8l$NMM$J$b$N$O:n$l( B >$J$$$N$G$O$J$$$H;W$$$^$9!#(B $BL^O@$=$NDL$j$G$9!"(B $B$H$$$&$h$j?M9)CNG=(B program $B$G$bFbB"$7$J$$8B$jIT2DG=$G$9!#(B == $B$bDj5A$G$-$^$;$s!#(B $B$7$+$7(B Cauchy $BNs$N;MB'1i;;$O(B Cauchy $BNs$G$9$+$ie$OLdBj$J$$$ N$G$(B $B$H;W$$$^$9!#(B $BL58B?tNs$G.?tI=8=$H$_$J$9J}K!(B $B!"O"J,?tI=8=Ey?'!9$"$j$^$9$,(B $BM-M}?t$N(B Cauchy $BNs$G(B $BI=8=$7$?$b$N$r(B idea $B$,J,$+$kDxEY$K>JN,$7$F=q$$$F$*$-$^$9!#(B $B2<$9$H(B bug $B$,F~$j$^$9$N$G!"85$N7A$N$^$^$G=q$-$^$9!#(B Real.rb -------- class Sequence def initialize(list,*x) @list=list @x=x @proc=eval("proc{"+yield+"}") end def [](n) @list[n] || @list[n]=@proc.call(n,*@x) end def /(y) x=self case y when Numeric Sequence.new([],x,y){"|n,x,y| x[n]/y"} else Sequence.new([],x,y){"|n,x,y| x[n]/y[n]"} end end end class Real < Sequence def +(y) x=self Real.new([],x,y){"|n,x,y| x[n]+y[n]"} end def -(y) x=self Real.new([],x,y){"|n,x,y| x[n]-y[n]"} end def -@ x=self Real.new([],x){"|n,x| -x[n]"} end def *(y) x=self case y when Numeric Real.new([],x,y){"|n,x,y| x[n]*y"} else Real.new([],x,y){"|n,x,y| x[n]*y[n]"} end end def /(y) x=self case y when Numeric Real.new([],x,y){"|n,x,y| x[n]/y"} else Real.new([],x,y){"|n,x,y| x[n]/y[n]"} end end def each_index(n=0,m=nil) if not m i=n loop do yield(i) i+=1 end else (n..m).each{|i| yield(i)} end end def succ_each(n=0,m=nil) each_index{|i| yield(self[i],self[i+1],i)} end def succ_find r=nil;succ_each{|x,y,i| if yield(x,y,i) then r=x;break;end};r end def sqrt x=self Real.new([Rational(1)],x){"|n,x| a=self[n-1];y=x[n];(a+y/a)/2 "} end def print(n=16,r=10) self.succ_find{|x,y,i| (x-y).abs < Rational(1,r**n)}.printd(n,r) end end class Object def Real(x) Real.new([x],x){"|n,x| x"} end end require "rational.rb" class Rational def to_d(r=10) a=@numerator b=@denominator Sequence.new([a],b,r){"|n,b,r| r*(self[n-1]%b)"}/b end def printd(n,r) s=to_d(r) print s[0],"." for i in 1..n printf("%x",s[i]) end end end ------ sqrt.rb ------ require "Real.rb" x=ARGV.shift.to_i n=ARGV.shift.to_i r=10 Real(x).sqrt.print(n,r);print "\n" ----- $BNc$($P(B time ruby sqrt.rb 2 100 $B$H$9$k$H(B 1.4142135623730950488016887242096980785696718753769480731766797379907324784621 070388503875343276415727 real 0m1.192s user 0m0.640s sys 0m0.090s $B$H$J$j$^$9!#(B (Pentium 150M) Gauss $BK!$K$h$k(B $B1_<~N($N7W;;$r;n$7$F$_$^$7$?$,!"(B Pentium 150M $B$K$O2Y$,=E$$$i$7$/(B $B