Last active
April 27, 2021 17:50
-
-
Save amiika/1c01a48644f2d26d89ad70621599c4b3 to your computer and use it in GitHub Desktop.
integer_sequences.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Number sequence enumerators | |
define :fibonacci do | |
Enumerator.new do |y| | |
a = b = 1 | |
while true do | |
y << a | |
a, b = b, a + b | |
end | |
end | |
end | |
define :primes do |from=2| | |
(from..).lazy.select{|i| (2..Math.sqrt(i)).none? {|n| (i % n).zero?}} | |
end | |
define :prime_difference do | |
Enumerator.new do |y| | |
prime = 2 | |
next_prime = 3 | |
primes = primes 5 | |
while true | |
y << next_prime-prime | |
prime = next_prime | |
next_prime = primes.next | |
end | |
end | |
end | |
# https://rosettacode.org/wiki/Pi#Ruby | |
define :pi do | |
Enumerator.new do |y| | |
q, r, t, k, n, l = 1, 0, 1, 1, 3, 3 | |
while true | |
if 4*q+r-t < n*t then | |
y << n | |
nr = 10*(r-n*t) | |
n = ((10*(3*q+r)) / t) - 10*n | |
q *= 10 | |
r = nr | |
else | |
nr = (2*q+r) * l | |
nn = (q*(7*k+2)+r*l) / (t*l) | |
q *= k | |
t *= l | |
l += 2 | |
k += 1 | |
n = nn | |
r = nr | |
end | |
end | |
end | |
end | |
# https://web.archive.org/web/20100730015238/http://www.cs.utsa.edu/~wagner/pi/ruby/pi_works.html | |
# https://oeis.org/A001622 | |
define :phi do | |
Enumerator.new do |y| | |
k, a, b, a1, b1 = 2, 2, 1, 3, 2 | |
while true | |
p, q, k = 1, 1, k+1 | |
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1 | |
d = a / b | |
d1 = a1 / b1 | |
while d == d1 | |
y << d | |
a, a1 = 10*(a%b), 10*(a1%b1) | |
d, d1 = a/b, a1/b1 | |
end | |
end | |
end | |
end | |
# https://oeis.org/A001113 | |
define :euler do | |
Enumerator.new do |y| | |
k, a, b, a1, b1 = 2, 3, 1, 8, 3 | |
while true | |
p, q, k = k, k+1, k+1 | |
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1 | |
d = a / b | |
d1 = a1 / b1 | |
while d == d1 | |
y << d | |
a, a1 = 10*(a%b), 10*(a1%b1) | |
d, d1 = a/b, a1/b1 | |
end | |
end | |
end | |
end | |
# https://www.mathpages.com/home/kmath312/kmath312.htm | |
define :reverse_sum do |n=17509097067,base=10| | |
Enumerator.new do |y| | |
while true | |
y << n | |
n = (n.to_i+n.to_s.reverse.to_i).to_s(base).to_i | |
end | |
end | |
end | |
# https://en.wikipedia.org/wiki/Collatz_conjecture | |
# https://themarquisdesheric.github.io/collatz-conjecture-music/ | |
define :collatz do |n=987654321| | |
Enumerator.new do |enum| | |
while n > 1 | |
n = n % 2 == 0 ? n / 2 : 3 * n + 1 | |
enum.yield n | |
end | |
end | |
end | |
# https://en.wikipedia.org/wiki/Arithmetic_progression | |
define :aprog do |a=1,x=2,e=Float::INFINITY| | |
(a..e).lazy.collect {|n| a+(n-1)*x } | |
end | |
# https://en.wikipedia.org/wiki/Geometric_progression | |
define :gproq do |a=1,r=2,e=Float::INFINITY| | |
(a..e).lazy.collect {|n| a * r ** (n-1) } | |
end | |
# https://en.wikipedia.org/wiki/Quadratic_function | |
define :quadratic do |a,b,c,s=0,e=Float::INFINITY| | |
(s..e).lazy.collect {|n| a*(n**2)+(b*n)+c } | |
end | |
define :primes do |e=Float::INFINITY| | |
(2..e).lazy.reject {|n| (2..Math.sqrt(n)).any?{ |j| n % j == 0 }} | |
end | |
# https://oeis.org/A005132 | |
define :recaman do | |
Enumerator.new do |y| | |
s = [] | |
0.step do |i| | |
x = i == 0 ? 0 : s[i-1]-i | |
s << ((x>=0 and !s.include? x) ? x : s[i-1]+i) | |
y << s[i] | |
end | |
end | |
end | |
# https://oeis.org/A005185 | |
define :hoffQ do | |
Enumerator.new do |y| | |
q = [] | |
0.step do |i| | |
q << (i<2 ? 1 : q[i - q[i - 1]] + q[i - q[i - 2]]) | |
y << q[i] | |
end | |
end | |
end | |
# https://oeis.org/A002487 | |
define :sterns do | |
Enumerator.new do |y| | |
a=[1,1] | |
0.step do |i| | |
y << (i>0 ? a[i] : 0) | |
a << a[i]+a[i+1] << a[i+1] | |
end | |
end | |
end | |
# https://oeis.org/A000265 | |
define :frac2 do | |
Enumerator.new do |y| | |
1.step do |n| | |
n>>=1 while n%2==0 | |
y << n | |
end | |
end | |
end | |
# https://oeis.org/A030101 | |
define :binrev do |base=2| | |
Enumerator.new do |y| | |
0.step do |n| | |
y << n.to_s(base).reverse.to_i(base) | |
end | |
end | |
end | |
# https://oeis.org/A000217 | |
define :triangular do | |
Enumerator.new do |y| | |
s = [] | |
0.step do |i| | |
s[i]=i+1 | |
y << s.inject(&:+) | |
end | |
end | |
end | |
# Generative methods | |
# Creates self similar sequence from given init state and range | |
define :self_similar do |start=[0], range=(1..10), number=5| | |
range.to_a.pick(number).inject(start) {|acc,j| acc.flat_map{|n|[n,n+j]}} | |
end | |
# Creates sequence that resembles sloth canon | |
define :sloth_series do |start=[0,1,0]| | |
start.inject(start) {|acc,j| acc.flat_map{|n|[n,n+j]}} | |
end | |
# Count of certain digits in given base | |
# By default same as digit sum in base 2 | |
define :digit_count do |n,num=1,base=2| | |
n.to_s(base).count(num.to_s) | |
end | |
# Sum of digits in given base, for example: | |
# http://oeis.org/A000120 | |
# http://oeis.org/A007953 | |
# http://oeis.org/A053735 | |
define :digit_sum do |n,base=2| | |
n.to_s(base).chars.reduce(0) { |sum,n| sum = sum.to_i + n.to_i} | |
end | |
# https://oeis.org/A004718 | |
# https://web.archive.org/web/20071010092358/http://www.pernoergaard.dk/eng/strukturer/uendelig/ukonstruktion03.html | |
define :norgard do |n| | |
n.to_s(2).chars.reduce(0) {|s,b| b == '1' ? s+1 : -s } | |
end | |
# Get all integers that sum to given integer (Not including 1 and itself) | |
define :integer_sum do |value, max = value| | |
if value == 0 | |
[[]] | |
else | |
2.upto(max-1).flat_map do |n| | |
integer_sum(value - n, [value, n].min).map do |ns| | |
[n] + ns | |
end | |
end | |
end | |
end | |
# Get all divisors to integer divided to integers that lead to even, odd or primes (Not including 1 and itself) | |
define :divisors do |s| | |
parts = {:to_even=>[], :to_odd=>[], :to_prime=>[]} | |
(2..s-1).map do |i| | |
if s%i==0 | |
parts[:even].push(s/i) | |
else | |
if ((2..Math.sqrt(i)).none? { |n| (i % n).zero? }) | |
parts[:prime].push(i) | |
else | |
parts[:odd].push(i) | |
end | |
end | |
end | |
parts | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment