2016年7月14日木曜日

開発環境

オイラーの贈物―人類の至宝eiπ=-1を学ぶ (吉田 武(著)、東海大学出版会)の第4部(附録(Appendix))、附録 A(発展的話題(Advanced topics))、A.1(ユークリッドの互除法)を取り組んでみる。

Euclidean algorithm

JavaScript で 書いていろいろな数字で試してたら、大きな数字で NaN になったから、Scheme でもコードを書いて試してみることに。JavaScript でも任意精度の整数が欲しくなってきたかも。。

コード(Emacs)

Scheme

(define euclidean-algorithm
  (lambda (m n)
    (define q (floor-quotient m n))
    (define r (floor-remainder m n))
    (if (= r 0)
        n
        (euclidean-algorithm n r))))

(define euclidean-algorithm-log
  (lambda (m n)
    (define q (floor-quotient m n))
    (define r (floor-remainder m n))
    (display m)
    (display " = ")
    (display q)
    (display " × ")
    (display n)
    (display " + ")
    (display r)
    (newline)
    (if (= r 0)
        n
        (euclidean-algorithm-log n r))))

(define method-of-mutual-division euclidean-algorithm)
(define method-of-mutual-division-log euclidean-algorithm-log)

HTML5/JavaScript

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<input id="m0" type="number" min="1" value="156" placeholder="156">
<input id="n0" type="number" min="1" value="65" placeholder="65">
<div id="result0"></div>
<script src="euclidean_algorithm.js"></script>
var euclidean_algorithm,
    display,
    calc,
    sum;

display = function (html) {
    $('#result0').append(html);
};

euclidean_algorithm = function (m, n) {
    var q = Math.floor(m / n),
        r = m % n;

    display(m + ' = ' + q + ' × ' + n + ' + ' + r + '<br>');
    if (r === 0) {
        display('gcd: ' + n + '<br>' + 'lcm: ' + (sum / n));
    } else {
        euclidean_algorithm(n, r);
    }
};

calc = function () {
    var m = parseInt($('#m0').val(), 10),
        n = parseInt($('#n0').val(), 10);

    $('#result0').html('');
    if (isNaN(m) || isNaN(n)) {
        $('#result0').append('NaN');
    } else {
        sum = m * n;
        euclidean_algorithm(m,n);
    }
};

$('#m0').keydown(calc);
$('#n0').keydown(calc);

0 コメント:

コメントを投稿