# Re: Goedel (#147)

**URL:** <https://www.ruby-forum.com/t/re-goedel-147/120594>\
**Category:** Ruby\
**Created:** [November 18, 2007, 11:38pm UTC](https://www.ruby-forum.com/t/re-goedel-147/120594 "2007-11-18T23:38:00Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![jameskelly](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/3ab097/32.png) [@jameskelly](https://www.ruby-forum.com/u/jameskelly)\
**Post date:** [November 18, 2007, 11:38pm UTC](https://www.ruby-forum.com/t/re-goedel-147/120594/1 "2007-11-18T23:38:00Z")

</div>

Obviously, I didn’t know about the mathn library when I wrote this:

PRIMES = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,  
73,79,83,89,97,101,103,107,109,113,  
127,131,137,139,149,151,157,163,167,173,  
179,181,191,193,197,199,211,223,227,229,  
233,239,241,251,257,263,269,271,277,281,  
283,293,307,311,313,317,331,337,347,349,  
353,359,367,373,379,383,389,397,401,409,  
419,421,431,433,439,443,449,457,461,463,  
467,479,487,491,499,503,509,521,523,541,  
547,557,563,569,571,577,587,593,599,601,  
607,613,617,619,631,641,643,647,653,659,  
661,673,677,683,691,701,709,719,727,733,  
739,743,751,757,761,769,773,787,797,809,  
811,821,823,827,829,839,853,857,859,863,  
877,881,883,887,907,911,919,929,937,941,  
947,953,967,971,977,983,991,997,1009,1013,  
1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,  
1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,  
1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,  
1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,  
1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,  
1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,  
1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,  
1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,  
1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,  
1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,  
1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,  
1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,  
1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,  
1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,  
2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,  
2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,  
2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,  
2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,  
2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,  
2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,  
2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,  
2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,  
2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,  
2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,  
2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,  
2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,  
3001,3011,3019,3023,3037,3041,3049,3061,3067,3079,  
3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,  
3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,  
3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,  
3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,  
3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,  
3517,3527,3529,3533,3539,3541,3547,3557,3559,3571,  
3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,  
3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,  
3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,  
3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,  
3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,  
4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,  
4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,  
4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,  
4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,  
4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,  
4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,  
4507,4513,4517,4519,4523,4547,4549,4561,4567,4583,  
4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,  
4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,  
4759,4783,4787,4789,4793,4799,4801,4813,4817,4831,  
4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,  
4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,  
5009,5011,5021,5023,5039,5051,5059,5077,5081,5087,  
5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,  
5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,  
5281,5297,5303,5309,5323,5333,5347,5351,5381,5387,  
5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,  
5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,  
5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,  
5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,  
5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,  
5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,  
5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,  
5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,  
6067,6073,6079,6089,6091,6101,6113,6121,6131,6133,  
6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,  
6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,  
6311,6317,6323,6329,6337,6343,6353,6359,6361,6367,  
6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,  
6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,  
6577,6581,6599,6607,6619,6637,6653,6659,6661,6673,  
6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,  
6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,  
6841,6857,6863,6869,6871,6883,6899,6907,6911,6917,  
6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,  
7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,  
7109,7121,7127,7129,7151,7159,7177,7187,7193,7207,  
7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,  
7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,  
7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,  
7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,  
7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,  
7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,  
7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,  
7841,7853,7867,7873,7877,7879,7883,7901,7907,7919]

class Array  
def inject\_with\_index(sum=self[0])  
each\_with\_index{|el,idx|sum=yield(sum,el,idx)}  
sum  
end  
end

if ARGV[0] == ‘-e’ #encode  
msg = ARGV[1…-1].join(" ")  
encoded\_msg = msg.scan(/./).inject\_with\_index(1){|prod,charstr,idx|  
prod\*(PRIMES[idx]\*\*(charstr[0]+1))}  
puts encoded\_msg  
elsif ARGV[0]==‘-d’ #decode  
encoded\_msg = ARGV[1].to\_i  
decoded\_msg = “”  
pos = 0  
while encoded\_msg \> 1  
count = 0  
until encoded\_msg % PRIMES[pos] != 0  
encoded\_msg /= PRIMES[pos]  
count += 1  
end  
decoded\_msg \<\< (count-1).chr  
pos += 1  
end  
puts decoded\_msg  
end

```
  ____________________________________________________________________________________

```

Be a better sports nut! Let your teams follow you  
with Yahoo Mobile. Try it now.  
[http://mobile.yahoo.com/sports;\_ylt=At9\_qDKvtAbMuh1G1SQtBI7ntAcJ](http://mobile.yahoo.com/sports;_ylt=At9_qDKvtAbMuh1G1SQtBI7ntAcJ)

---

<div class="post-metadata">

**Author:** ![jameskelly](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/3ab097/32.png) [@jameskelly](https://www.ruby-forum.com/u/jameskelly)\
**Post date:** [November 19, 2007, 12:07am UTC](https://www.ruby-forum.com/t/re-goedel-147/120594/2 "2007-11-19T00:07:16Z")

</div>

On Nov 18, 2007 5:37 PM, James K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Obviously, I didn’t know about the mathn library when I wrote this:
> 
> PRIMES = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,  
> 73,79,83,89,97,101,103,107,109,113,

I also hadn’t found the mathn library yet when I wrote my first  
version. Below are two versions: my first working version and the  
current version. I like the current version much better, but the  
lengths are almost the same. I really like being able to add methods  
to existing classes like this.

# begin first version

class Encryption  
def Encryption.encode(msg,prev\_prime=1)  
return 1 if msg.size.zero?  
this\_prime = next\_prime(prev\_prime)  
return (this\_prime \*\* (1 + msg[0])) \*  
encode(msg.slice(1,msg.size),this\_prime)  
end  
def Encryption.decode(num,prev\_prime=1)  
return “” unless num \> 1  
this\_prime = next\_prime(prev\_prime)  
multiplicity = factor\_multiplicity(this\_prime,num)  
(multiplicity-1).chr + Encryption.decode(num / (this\_prime \*\*  
multiplicity), this\_prime)  
end  
private  
def Encryption.prime?(num)  
(num - 1).downto(2) {|factor| return false if  
num.modulo(factor).zero?}  
true  
end  
def Encryption.next\_prime(prev)  
n = prev + 1  
return n if prime?(n)  
next\_prime(n)  
end  
def Encryption.factor\_multiplicity(factor,num)  
1.upto(num) {|x| return x - 1 unless num.modulo(factor\*\*x).zero?}  
end  
end

puts “Test encoding: “+Encryption.encode(“Ruby\n”).to\_s+”\n”  
puts “Test decoding:  
“+Encryption.decode(Encryption.encode(“Ruby\n”))+”\n”

# end first version

# begin current version

require ‘mathn’

class Prime  
def last  
@primes.last  
end  
end

class String  
def to\_godel(primes=Prime.new)  
return 1 if size.zero?  
return (primes.next \*\* (1 + self[0])) \*  
slice(1,size).to\_godel(primes)  
end  
def self.from\_godel(num,primes=Prime.new)  
return “” unless num \> 1  
multiplicity = factor\_multiplicity(primes.next,num)  
(multiplicity-1).chr + from\_godel(num / (primes.last \*\*  
multiplicity), primes)  
end  
private  
def self.factor\_multiplicity(factor,num)  
1.upto(num) {|x| return x - 1 unless num.modulo(factor\*\*x).zero?}  
end  
end

puts “Test encoding: “+“Ruby\n”.to\_godel.to\_s+”\n”  
puts “Test decoding: “+String.from\_godel(“Ruby\n”.to\_godel)+”\n”

# end current version

–  
There are two ways of constructing a software design: One way is to  
make it so simple that there are obviously no deficiencies, and the  
other way is to make it so complicated that there are no obvious  
deficiencies. The first method is far more difficult.

```
                - C.A.R. Hoare -

```
