Advertisement
ifXE9-Hb62tS

原始数列システムでε_0までの順序数を扱う

Oct 13th, 2015
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.96 KB | None | 0 0
  1. =begin
  2. 1: (0)
  3. 2: (0,0)
  4. ω: (0,1)
  5. ω*2: (0,1,0,1)
  6. ω^2: (0,1,1)
  7. ω^ω: (0,1,2)
  8. ω^(ω*2): (0,1,2,1,2)
  9. ω^ω^2: (0,1,2,2)
  10. ω^ω^ω: (0,1,2,3)
  11.  
  12. ja: http://ja.googology.wikia.com/wiki/%E5%8E%9F%E5%A7%8B%E6%95%B0%E5%88%97%E6%95%B0
  13. en: http://googology.wikia.com/wiki/User_blog:Kyodaisuu/A_program_of_Kirby-Paris_hydra
  14. =end
  15.  
  16. class Priseq
  17.     def self.[] *m;new *m end
  18.     attr_reader :m
  19.     def initialize *m;@m = m end
  20.     def succ;Primat[*@m,0] end
  21.     def succ?;@m.last===@m.min end
  22.     def zero?;@m.size===0 end
  23.     def === x;min=@m.min;return @m===x.m.map{|a|a-min} if x.is_a? Priseq;false end
  24.     def pred;return Priseq[*@m[0..-2]] if succ?;self end
  25.     def < x
  26.         if x.is_a? Priseq
  27.             min = @m.min
  28.             m = x.m.map{|c|c-min}
  29.             r = @m.each_with_index do |a,i|
  30.                 b = m[i]
  31.                 return false unless b
  32.                 return true if a<b
  33.             end
  34.             return false if r==@m
  35.             return r
  36.         end
  37.         false
  38.     end
  39.     def > x
  40.         if x.is_a? Priseq
  41.             min = @m.min
  42.             m = x.m.map{|c|c-min}
  43.             r = m.each_with_index do |a,i|
  44.                 b = @m[i]
  45.                 return false unless b
  46.                 return true if a<b
  47.             end
  48.             return false if r==m
  49.             return r
  50.         end
  51.         true
  52.     end
  53.     def >= x;!(self<x) end
  54.     def <= x;!(self>x) end
  55.     def + x
  56.         return Priseq[*(self<x ? x.m+@m : @m+x.m)] if x.is_a?
  57.         Priseq[*@m, *([0]*x.to_i)]
  58.     end
  59.     def to_s;'('+@m.join(',')+')' end
  60.     def [] n
  61.         min = @m.min
  62.         i = @m.rindex{|a|a>min}
  63.         a = @m[i]
  64.         r = Priseq[*@m]; m = r.m
  65.         j = m[0,i].rindex{|b|b<a}
  66.         m.delete_at i
  67.         m.insert j, *(m.slice!(j,i-j) * n)
  68.         return m.size if m.all?{|c|min===c}
  69.         r
  70.     end
  71. end
  72. def Priseq *m;Priseq.new *m end
  73. class Integer;def succ?;self>0 end end
  74.  
  75. #Slow-growing hierarchy
  76. def g(a,n)
  77.     return 0 if a.zero?
  78.     return g(a.pred,n)+1 if a.succ?
  79.     g(a[n],n)
  80. end
  81.  
  82. #Hardy hierarchy
  83. def H(a,n)
  84.     return n if a.zero?
  85.     return g(a.pred,n+1) if a.succ?
  86.     H(a[n],n)
  87. end
  88.  
  89. #Fast-growing hierarchy
  90. def f(a,n)
  91.     return n+1 if a.zero?
  92.     if a.succ?
  93.         r = n; b = a.pred
  94.         n.to_i.times{ r = f(b,r) }
  95.         return r
  96.     end
  97.     f(a[n],n)
  98. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement