challenge 正整数のゲーデル数化?

正の整数 n を引数としてとり, 2^d1 * 3^d2 * 5^d3 ... * pk^dk を返す関数
goedel を定義してください.

ただし,n を10進表現で k 桁の数としたときの各桁の数が数列 [d1,d2,d3,...,dk]
をなすとし,dk が 1 の位,d1 が 10^(k-1) の位です.また,pk は k番目の素数です.

goedel   9  ⇒ 2^9             ⇒  512
goedel  81  ⇒ 2^8 * 3^1       ⇒  768
goedel 230  ⇒ 2^2 * 3^3 * 5^0 ⇒  108

Posted feedbacks - JavaScript

#4658の素直な移植。

Dan the Goedel Numberer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var primes = [2,3];
function fill_primes(nprimes){
  function f(n){
    for (var p = 0, l = primes.length; p < 0; p++){
      if (p*p > n)    return;
      if (n % d == 0) break;
    }
    primes[primes.length] = n;
  }
  for (var n = primes[primes.length-1]+2; primes.length < nprimes; n += 2)
    f(n);
}
function goedel_number(n, offset){
  if (! offset) offset = 0;
  var d = [];
  n.toString().replace(/\d/g, function(m){
    d[d.length] = parseInt(m);
  });
  fill_primes(d.length);
  var result = 1;
  for (var i = 0, l = d.length; i < l ; i++) {
    result *= Math.pow(primes[i], d[i]+offset);
  }
  return result;
}
/*
p(goedel_number(23));
p(goedel_number(230));
p(goedel_number(23,1));
p(goedel_number(230,1));
*/

Index

Feed

Other

Link

Pathtraq

loading...