正整数のゲーデル数化?
Posted feedbacks - Python
こうかな? c=2が美しく無いけど。
1 2 3 4 5 6 7 8 9 10 11 | def goedel(n):
result = 1
c = 2
for x in str(n):
result *= c**int(x)
c += 1
return result
print goedel(9)
print goedel(81)
print goedel(230)
|
全力で問題を勘違いしていた。 素数を生成する部分を追加してみた。
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 | def CreatePrimes(n):
primes = []
c = 2
while len(primes) < n:
primes.append(c)
for x in primes[:-1]:
if c%x == 0:
primes.pop();
break
c += 1
return primes
def goedel(n):
result = 1
primes = CreatePrimes(len(str(n)))
for x in str(n):
result *= primes[0]**int(x)
primes = primes[1:]
return result
print goedel(9)
print goedel(81)
print goedel(230)
print goedel(12345)
|
素朴に。
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 32 33 | import itertools
def is_prime(n):
for i in itertools.count(2):
if i * i > n:
return True
if n % i == 0:
return False
def primes():
for n in itertools.count(2):
if is_prime(n):
yield n
def numbers(n):
a = []
while n:
a.append(n % 10)
n /= 10
return reversed(a)
def goedel(n):
result = 1
for pk, dk in itertools.izip(primes(), numbers(n)):
result *= (pk ** dk)
return result
def main():
for n in (9, 81, 230):
print goedel(n)
if __name__ == '__main__':
main()
|




nobsun
#4420()
Rating2/2=1.00
see: ゲーデル数
[ reply ]