2017年6月24日土曜日

開発環境

ということで、からみあう素数に出てくる φ(n) (n ∈ ℕ - {0})(オイラーのφ関数、オイラーのトーシェント関数(Euler's totient function))を再帰関数を利用して定義してみた。

コード(Emacs)

HTML5

<pre id="output0"></pre>
<label for="n0">n = </label>
<input id="n0" min="1" step="1" type="number" value="10">
<button id="run0">run</button>
<button id="clear0">clear</button>

<script src="sample.js"></script>    

JavaScript

let pre0 = document.querySelector('#output0'),
    btn0 = document.querySelector('#run0'),
    btn1 = document.querySelector('#clear0'),
    input_n0 = document.querySelector('#n0'),
    inputs = [input_n0],
    p = (x) => pre0.textContent += x + '\n';

// ユークリッド互除法
let gcd = (a, b) =>
    b === 0 ? a :
    gcd(b, a % b);

let isDisjoint = (m, n) => gcd(m, n) === 1;

let φ = (n) => {
    let inner = (i) =>
        i > n ? 0 :
        (isDisjoint(i, n) ? 1 : 0) + inner(i + 1);

    return inner(1);
};

// メモリー節約版
let φ1 = (n) => {
    let inner = (i, result) =>        
        i > n ? result :
        inner(i + 1, result + (isDisjoint(i, n) ? 1 : 0));

    return inner(1, 0);
};

let output = () => {
    let n = parseInt(input_n0.value, 10);

    p((${n}) = ${φ(n)}`);
    p(1(${n}) = ${φ1(n)}`);
};

let clear = () => pre0.textContent = '';

inputs.forEach((input) => input.onchange = output);
btn0.onclick = output;
btn1.onclick = clear;

output();








  







						

0 コメント:

コメントを投稿