Guest User

Untitled

a guest
Mar 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.69 KB | None | 0 0
  1. def f1(n)
  2. n = (n * 3 + 1) / 2 while (n.odd?)
  3. n /= 2 while (n.even?)
  4. return n
  5. end
  6.  
  7. def f2(n)
  8. return n.odd? ? (n * 3 + 1) / 2 : n / 2
  9.  
  10. end
  11.  
  12.  
  13. def widthdiff(x, y)
  14. x.to_s(2).length - y.to_s(2).length
  15. end
  16.  
  17. def widthratio(x, y)
  18. x.to_s(2).length.to_f / y.to_s(2).length
  19. end
  20.  
  21. def widthratio100(x, y)
  22. (widthratio(x, y) * 100).to_i
  23. end
  24.  
  25. def d(s)
  26. c = s.split('').select { |x| x == '1' }.size
  27. d = c.to_f / s.length
  28. return d
  29.  
  30. end
  31.  
  32. def count(x)
  33. n = n1 = x['n']
  34. l = [n]
  35. cg = nil
  36. while (n != 1)
  37. n = f1(n)
  38. cg = l.size if (cg.nil? && n < n1)
  39. l << n
  40. end
  41. cm = (0...l.size).max_by { |x| l[x] }
  42. return x.merge!({'cm' => cm,
  43. 'cg' => cg.nil? ? 0 : cg,
  44. 'm' => l[cm].to_s(2).length,
  45. 'w' => widthdiff(l[cm], n1),
  46. 'r' => widthratio(l[cm], n1),
  47. 'c' => l.size,
  48. 'd' => (0.5 - d(n1.to_s(2))).abs,
  49. 'l' => l,
  50. 'nl' => n1.to_s(2).length})
  51. end
  52.  
  53.  
  54. def count2(z)
  55.  
  56. n = z['n']
  57. n1 = n
  58. l = [n]
  59. begin
  60. n = f2(n)
  61. l << n
  62. end while (n > n1)
  63.  
  64. cm2 = (0...l.size).max_by { |x| l[x] }
  65. w2 = widthdiff(l[cm2], n1)
  66. v2 = widthratio100(l[cm2], n1)
  67.  
  68. return z.merge({'c2' => l.size,
  69. 'cm2' => cm2,
  70. 'w2' => w2,
  71. 'v2' => v2,
  72. 'd' => (0.5 - d(n1.to_s(2))).abs})
  73. end
  74.  
  75. def next2(z)
  76.  
  77. p = z['p'] + 1
  78. return [z, count({'n'=>z['n'] + 2 ** p, 'p'=>p}), z.merge({'p'=>p})]
  79. end
  80.  
  81.  
  82. def hard(c)
  83.  
  84. k = 'w'
  85. l = [next2(count({'n' => 1, 'p' => 0}))]
  86.  
  87. a = nil
  88.  
  89. c.times \
  90. {
  91. |j|
  92. l1 = (0...l.size).sort_by { |x| [-l[x][1][k], l[x][1]['d']] }
  93.  
  94. a = l[l1[0]][1].select { |k, | k != 'l'}
  95. $stderr.puts("j #{j} #{a}") if (j % 100 == 0)
  96.  
  97. i = l1[rand([l1.size, 20].min)]
  98. z = l.delete_at(i)
  99.  
  100. l << next2(z[1])
  101. l << next2(z[2])
  102.  
  103. }
  104. return l.map { |x| x[0] }
  105. return a
  106. end
  107.  
  108. def stat(l)
  109. l = [0] if (l.empty?)
  110. t = t2 = 0
  111. l.each \
  112. {
  113. |x|
  114. t += x
  115. t2 += x ** 2
  116. }
  117. c = l.size
  118. a = t.to_f / c
  119. z = t2.to_f / c - a ** 2
  120. sd = Math.sqrt(z < 0 ? 0 : z)
  121.  
  122. return a, sd, l.max.to_f, c.to_f
  123. end
  124.  
  125. def stat2(l, t, n)
  126. l1 = stat(l)
  127.  
  128. return Hash[[["a#{n}", "sd#{n}", "mx#{n}", "c#{n}",
  129. "a#{n}s", "sd#{n}s", "mx#{n}s", "c#{n}s"],
  130. l1 + l1.map { |x| x / t }].transpose]
  131. end
  132.  
  133. def d(s)
  134. c = s.split('').select { |x| x == '1' }.size
  135. d = c.to_f / s.length
  136. return d
  137.  
  138. end
  139.  
  140. def data(z)
  141.  
  142. n = z['n']
  143. $seen = {'h' => 0} if ($seen.nil?)
  144. seen = $seen
  145.  
  146. if (seen.member?(n)) then
  147. seen['h'] += 1
  148. $stderr.puts("\t\th #{seen['h']} ss #{seen.size}") if (seen['h'] % 10000 == 0)
  149. return z.merge(seen[n])
  150. end
  151.  
  152.  
  153. ns = n.to_s(2)
  154. nl = ns.length
  155. m = nl / 2
  156.  
  157. nsh = ns[0..m]
  158. nsl = ns[m..-1]
  159.  
  160. asdm1 = stat2(l1 = ns.split(/0+/).map { |x| x.length }, nl, 1)
  161. asdm0 = stat2(l0 = [ns.split(/1+/)[1..-1]].compact.flatten.map { |x| x.length }, nl, 0)
  162.  
  163.  
  164. x = {'n' => n, 'ns' => ns, 'nl' => nl, 'd' => (d = d(ns) - 0.5),
  165. 'dc' => d.abs, 'e' => 1.0 - (l1.length + l0.length).to_f / nl,
  166. 'dh' => d(nsh) - 0.5, 'dl' => d(nsl) - 0.5}.merge(asdm1).merge(asdm0)
  167. seen[n] = x if (seen.size < 100e3)
  168. return z.merge(x)
  169. end
  170.  
  171. def subglides(l)
  172.  
  173. return l.map \
  174. {
  175. |x|
  176. l1 = x['l']
  177. l2 = (0...l1.size).map \
  178. {
  179. |i|
  180. j = i
  181. j += 1 while (j < l1.size - 2 && l1[j] >= l1[i])
  182. {'n' => l1[i], 'cg' => j - i, 'nl' => l1[i].to_s(2).length}
  183. }.select { |x| x['nl'] > 20 && x['cg'] >= 5}
  184. }.flatten
  185.  
  186. end
  187.  
  188. def sample(a, b)
  189.  
  190. l = []
  191. a.times { l.concat(hard(b)) }
  192.  
  193. l = subglides(l)
  194.  
  195. seen = {}
  196. c1 = l.size
  197. l.each { |x| seen[x['n']] = x }
  198.  
  199. $stderr.puts({'c1' => c1, 'c2' => l.size})
  200. l = seen.values
  201.  
  202. c = {}
  203. l.each { |x| c[x['nl']] = [] if (!c.member?(x['nl'])); c[x['nl']] << x }
  204. x = c.max_by { |k, v| v.size }
  205. $stderr.puts({'nl' => x[0], 'c' => x[1].size}.inspect)
  206. return x[1]
  207.  
  208. end
  209.  
  210. def linear(l, f, mn, mx, k)
  211.  
  212. c = (l.size * (1.0 / f)).to_i
  213.  
  214. raise ({'c1' => c, 'c2'=> l.size, 'f' => f}.inspect) if (c <= 1)
  215.  
  216. return if (c > l.size)
  217.  
  218. l1 = (0...l.size).to_a
  219.  
  220. r = mx - mn
  221. tm = nil
  222. l0 = []
  223. c.times \
  224. {
  225. |i|
  226.  
  227. t = mn + (i.to_f / (c - 1)) * r
  228.  
  229. l2 = (0...l1.size).map { |x| [x, (l[l1[x]][k] - t).abs / r] }
  230. i, t1 = l2.min_by { |x| x[1] }
  231. t2 = t1 * (c - 1)
  232. tm = [tm, t2].compact.max
  233. break if (t2 > 1.0)
  234.  
  235. l0 << l1.delete_at(i)
  236.  
  237. }
  238. $stderr.puts({'c' => c, 'f'=> f.to_i, 'tm' => tm.round(3)}.inspect)
  239. return if (l0.size != c)
  240. return l.values_at(*l0)
  241.  
  242. end
  243.  
  244.  
  245.  
  246. def resample(l, k)
  247.  
  248. mn = l.min_by { |x| x[k] }[k]
  249. mx = l.max_by { |x| x[k] }[k]
  250.  
  251. mn2 = (1.0 * mn).to_i
  252. mx2 = (1.0 * mx).to_i
  253.  
  254. $stderr.puts([k, 'ls', l.size, 'mn', mn, 'mn2', mn2, 'mx', mx, 'mx2', mx2].inspect)
  255.  
  256. f = 10
  257. l1 = linear(l, f, mn2, mx2, k)
  258.  
  259. if (l1.nil?) then
  260. begin
  261. f = (f * 1.25).to_i
  262.  
  263. end while ((l1 = linear(l, f, mn, mx, k)) == nil)
  264. else
  265. while ((l2 = linear(l, f = (f / 1.25).to_i, mn, mx, k)) != nil)
  266. l1 = l2
  267. end
  268. end
  269.  
  270. return l1.sort_by { |x| [-x[k]] }
  271. end
  272.  
  273. def mid(l, k, a, b)
  274.  
  275. l.sort_by! { |x| -x[k] }
  276. p(l[0...20].map { |x| x[k] })
  277.  
  278. f = File.open('out1.txt', 'w')
  279. l.each { |x| f.puts(x[k]) }
  280. f.puts
  281.  
  282. mx = l[0][k]
  283. mn = (mx * b).to_i
  284.  
  285. c1 = l.size
  286. l[0..(l.size * a).to_i] = []
  287. mn1 = l[-1][k]
  288. l.delete_if { |x| x[k] < mn }
  289. l.each { |x| f.puts(x[k]) }
  290. f.close
  291. $stderr.puts({'mn' => mn1, 'mn2' => l[-1][k], 'mx' => mx, 'mx2' => l[0][k], 'c1' => c1, 'c2' => l.size})
  292.  
  293. end
  294.  
  295. def out(a, ks = nil, j = nil)
  296.  
  297.  
  298. fn = 'out.txt'
  299. fn2 = 'gnuplot.cmd'
  300.  
  301. if ($f.nil?) then
  302. f = File.open(fn, 'w')
  303. f.puts(a.keys.join("\t"))
  304. f.close
  305.  
  306. f = File.open(fn2, 'w')
  307. f.puts("set colors classic; set ytics nomirror; set y2tics;")
  308. f.close
  309. $f = {}
  310. end
  311.  
  312. if (ks.nil?) then
  313. f = File.open(fn, 'a')
  314. f.puts(a.values.join("\t"))
  315. f.close
  316. return
  317. end
  318.  
  319. if (!$f.member?([ks, j])) then
  320. $f[[ks, j]] = nil
  321.  
  322. f = File.open(fn2, 'a')
  323. f.puts("plot \\")
  324. w = 25
  325. ks.each_with_index \
  326. {
  327. |x, i|
  328. y = 1
  329. y = 2 if (['nl', 'cg', 'c2', 'cm2', 'w2', 'v2'].member?(x))
  330.  
  331. lw = j.nil? ? (20 - 5 * i) : 3
  332. t = {true => "impulse lw #{lw}", false => 'line'}[['dh', 'dl', 'd', 'dlh', 'dc'].member?(x)]
  333.  
  334. z = 'lw 3' if (x == 'cg')
  335. c2 = j.nil? ? '' : "(column('j') + 0.2 * #{i}):"
  336.  
  337. f.puts("'#{fn}' using #{c2}(column('#{x}')) with #{t} #{z} axes x1y#{y} title '#{x}', \\")
  338. }
  339. f.puts
  340. f.puts("pause -1")
  341. f.close
  342.  
  343. end
  344.  
  345.  
  346. end
  347.  
  348. p = [[3, 500], [5, 2000]]
  349.  
  350. l = sample(*p[1]).map { |x| count2(x) }
  351.  
  352. l = l.select { |x| x['d'] < 0.05 }
  353.  
  354. k = 'cg'
  355. k = ARGV[0] if (!ARGV[0].nil?)
  356.  
  357. mid(l, k, 0.05, 0.10)
  358.  
  359. l = resample(l, k)
  360.  
  361.  
  362. f = File.open("grid.txt", 'w')
  363. l[0...20].each { |x| f.puts(x['n']) }
  364. f.close
  365.  
  366. l.each_with_index \
  367. {
  368. |x, j|
  369.  
  370. a = data(x)
  371. a['j'] = j
  372.  
  373. a['dlh'] = a['dl'] - a['dh']
  374.  
  375. a['a01s'] = a['a1s'] - a['a0s']
  376. a['sd01s'] = a['sd1s'] - a['sd0s']
  377. a['mx01s'] = a['mx1s'] - a['mx0s']
  378.  
  379. out(a)
  380. out(a, ['dlh', 'dl', 'dh', 'd', k])
  381. out(a, ['dlh', 'dl', 'dh', 'd', k], true)
  382.  
  383. out(a, [k, 'mx0s', 'mx1s', 'mx01s', 'c0s', 'c1s'])
  384. out(a, [k, 'a0s', 'a1s', 'sd0s', 'sd1s'])
  385. out(a, [k, 'a01s', 'sd01s'])
  386. }
Add Comment
Please, Sign In to add comment