JavaScriptで完全数を探す旅

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
1950にも完全数は隠れている

この記事を三行にまとめると

入力した数字が完全数か判定
ループの最大値を平方根にする
入力した数以下の完全数を抽出
この記事は以下の動画の中に出てきたサンプルコードを載せたものです。コピペなどが必要なときに使ってください。





HTMLとCSS

<div>
  <input type="number" id="number">
  <button type="button" id="start">検証開始</button>
</div>
<div id="divisor"></div>
<div id="result"></div>

<style>
  * { font-size: 24px; font-family: 'メイリオ' }
  body { text-align: center }
  input, button { padding: 5px }
</style>



入力した数字が完全数か判定する

number = document.getElementById('number');
start = document.getElementById('start');
divisor = document.getElementById('divisor');
result = document.getElementById('result');

start.onclick = function() {
  num = Number(number.value);
  sum = 0, lists = [];

  for(i = 1; i < num; i++) {
    if(num % i == 0) {
      sum += i;
      lists.push(i);
    }
  }

  divisor.innerText = '約数の合計は' + lists.join('+') + '=' + sum;
  result.innerText = (sum == num) ? '完全数です!' : '完全数じゃないです';
}



ループの最大値を平方根にする

start.onclick = function() {
  num = Number(number.value);
  sum = 1, lists = [1];
  sqrt = Math.sqrt(num);

  for(i = 2; i <= sqrt; i++) {
    if(num % i != 0) {
      continue;
    }

    sum += i;
    lists.push(i);

    quot = num / i;
    if(i != quot) {
      sum += quot;
      lists.push(quot);
    }
  }

  divisor.innerText = '約数の合計は' + lists.join('+') + '=' + sum;
  result.innerText = (sum == num) ? '完全数です!' : '完全数じゃないです';
}



入力した数以下の完全数を抽出

start.onclick = function() {
  num = Number(number.value);
  lists = [];

  for(j = 2; j <= num; j++) {
    if(divisor_sum(j)) {
      lists.push(j);
    }
  }

  result.innerText = num + '以下の完全数は' + lists.join(',');
}

function divisor_sum(num) {
  sum = 1;
  sqrt = Math.sqrt(num);

  for(i = 2; i <= sqrt; i++) {
    if(num % i != 0) {
      continue;
    }

    sum += i;

    quot = num / i;
    if(i != quot) {
      sum += quot;
    }
  }

  return (sum == num);
}
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください