平方根の計算

30分プログラム、その650。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_206にインスパイアされました。
上記ページからリンクされているパソコンなら演算が得意なのは理解出来ますが、現在100円クラス... - Yahoo!知恵袋平方根の計算方法が紹介されていました。

TVで言っていた話なのですが
その数字を1から順に奇数を引いていき、0になるまで計算(マイナスになったときはそ
の一つ前)
4=1+3
9=1+3+5
25=1+3+5+7+9
で、その奇数の数を何個足したかでルートが算出される。
割り切れない数字の場合もこの応用で計算していて、電卓のルート計算はこの方法を元に
制作しているそうです。

なんだ、これは?!
なんで計算できるのかも、奇数の理由もよく分からないし、割り切れない数にどうやって応用したらいいのかも分からない。
分からないことだらけだけど、とりあえずコードを作ってみよう。

使い方

for(0..20){
    my_sqrt($_);
    printf "%3d: %f %d\n",$_,sqrt($_),my_sqrt($_);
}

として、組込みのsqrtと自分で作ったmy_sqrtを比べてみる。

$ perl sqrt.pl
  0: 0.000000 0
  1: 1.000000 1
  2: 1.414214 1
  3: 1.732051 1
  4: 2.000000 2
  5: 2.236068 2
  6: 2.449490 2
  7: 2.645751 2
  8: 2.828427 2
  9: 3.000000 3
 10: 3.162278 3
 11: 3.316625 3
 12: 3.464102 3
 13: 3.605551 3
 14: 3.741657 3
 15: 3.872983 3
 16: 4.000000 4
 17: 4.123106 4
 18: 4.242641 4
 19: 4.358899 4
 20: 4.472136 4

ホントだ。ちゃんと計算できてる!

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# sqrt.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/08/31 21:27:36
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
use strict;
use warnings;
use Data::Dumper;
use List::AllUtils qw( :all );

sub my_sqrt($){
    my ($n,) = @_;

    my @xs = before { $n -= $_; $n < 0; } map { 2*$_ + 1 } 0..$n;
    scalar @xs;
}

for(0..100){
    my_sqrt($_);
    printf "%3d: %f %d\n",$_,sqrt($_),my_sqrt($_);
}