Hatena::ブログ(Diary)

みずぴー日記 Twitter

2009-08-31(月)

平方根の計算

| 平方根の計算を含むブックマーク

30分プログラム、その650。AWK Users JP :: sqrt() 関数を用いずに平方根インスパイアされました。

上記ページからリンクされているパソコンなら演算が得意なのは理解出来ますが、現在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($_);
}

参考

tizztizz 2009/09/01 02:23 (n+1)^2-n^2=2(n-1)+1になるってのを利用してるんじゃないですかね。
整数部分に関しては間違いなくそうですし

mzpmzp 2009/09/01 20:54 おお、なるほど!

RoccoRocco 2009/09/02 00:03 http://www.wizforest.com/gear/tiger/sqrt/

上の URL のところが直感的でわかりやすかったです。
元々、二乗とか平方根とかは土地の面積の問題として扱われていたはずなので、図に書けば良かったんですね。

mzpmzp 2009/09/02 21:59 ありがとうございます。
さっそくコードに落そうとしたら、なかなかややこしくて苦戦しています。