2009-07-28
2の平方根をけいさん!
プログラミング | |
2の平方根とは
面積2の正方形の一辺を求めること。x^2 = 2のxを求める。
某巨大掲示板の某スレッドがにぎわっていたので、色々調べてみましたところ、本当に色々ありました。勉強になったのでまとめてみました。
参考:
wolfram alpha
ウルフラムアルファさんに聞いてみます。
1.414213562373095048801688724209698078569671875376948073
1766797379907324784621070388503875343276415727
http://www.wolframalpha.com/input/?i=N%5Bsqrt%5B2%5D%2C101%5D
ニュートン法
x^2 = 2 の右項を左に移して、x^2 - 2 = 0 の方程式を解くことでxを求めます。メジャーな方法です。
use strict;
use warnings;
use bignum p => -110;
my $e = 10 ** -100;
my $x = 2;
my $x_1;
do{
$x_1 = $x;
$x = ($x + 2 / $x) / 2;
}while(abs(($x - $x_1) / $x_1) > $e);
print $x;
1.414213562373095048801688724209698078569671875376948073
17667973799073247846210703885038753432764157273501384623
参考:
連分数を利用
√2を連分数にすると1+1/(2+1/(2+1/...))と、再帰する形になりますので、最初の1を無視して1/(2+1/...)を計算をした後に、1を足せば√2と等しくなります。
use strict;
use warnings;
use bignum p => -110;
my $e = 10 ** -100;
my $x = 0;
my $x_1;
do{
$x_1 = $x;
$x = 1 / (2 + $x);
}while(abs(($x - $x_1) / $x_1) > $e);
$x += 1;
print $x;
1.414213562373095048801688724209698078569671875376948073
17667973799073247846210703885038753432764157273071637781
参考:
開平方
(x^2)の漸化式はx(n+1) = x(n)+2n+1で、1,3,5,7..という奇数の等差数列になります。平方根を求めたい数から1,3,5,7を順番に引いて行き、引けなくなった所の引いた回数が一桁の平方根になります。次の桁は元の数を100倍、引く数は前の桁の答えを2倍したものを加え10倍にして、順番に求めていきます。
整数の加減算と桁のシフトだけで求まるため、単純な計算機でも求めることができるのが面白いところです。
use strict;
use warnings;
use bigint;
my $d = 0;
my $x = 2;
my @l;
foreach(0..100){
my $c;
for($c = 0; $c < 9; $c++){
my $dx = $x - ($d + 2 * $c + 1);
($dx < 0) and last;
$x = $dx;
}
$x *= 100;
$d = ($d + 2 * $c) * 10;
push(@l, $c);
}
print @l;
1414213562373095048801688724209698078569671875376948073
1766797379907324784621070388503875343276415727
参考:
- 4 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBR_jaJP305JP305&q=use+strict
- 3 http://www.google.co.jp/search?q=use+strict&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 2 http://www.google.co.jp/search?hl=ja&q=use+strict&lr=&aq=f&oq=
- 2 http://www.google.co.jp/search?hl=ja&q=use+strict&lr=lang_ja
- 1 http://best-goods.cn/
- 1 http://d.hatena.ne.jp/diarylist?of=100&mode=rss&type=public
- 1 http://d.hatena.ne.jp/keyword/プログラミング
- 1 http://k.hatena.ne.jp/keywordblog/c++
- 1 http://oshiete.goo.ne.jp/search_goo/result/?PT=&from=&nsMT=&mt_opt=a&qatype=qa&st=all&sr=norm&tf=all&tfy=&tfm=&tfd=&tty=&ttm=&ttd=&good=0&dc=10&MT=平方根 求め方&c=
- 1 http://search.nifty.com/websearch/search?select=2&ss=up&cflg=検索&q=ふぁ?めん&ck=
