euler/crystal/euler.cr

67 lines
1.2 KiB
Crystal
Raw Normal View History

# miscellaneous stuff
2018-02-23 04:53:01 +00:00
require "big"
module Euler
2018-02-25 03:32:39 +00:00
extend self
alias NumType = Int32 | Int64 | UInt32 | UInt64
macro trial_division_method(given_type)
def trial_division(n : {{given_type}})
factors = [] of {{given_type}}
check = ->(p: {{given_type}}) {
2018-02-23 04:53:01 +00:00
q, r = n.divmod(p)
2018-02-25 03:32:39 +00:00
while r.zero?
factors << p
n = q
q, r = n.divmod(p)
end
}
check.call(2)
check.call(3)
p = 5
while p * p <= n
check.call(p)
p += 2
check.call(p)
p += 4
2018-02-23 04:53:01 +00:00
end
2018-02-25 03:32:39 +00:00
factors << n if n > 1
factors
2018-02-23 04:53:01 +00:00
end
end
2018-02-25 03:43:30 +00:00
trial_division_method(NumType)
trial_division_method(BigInt)
2018-02-23 04:53:01 +00:00
2018-02-25 03:43:30 +00:00
def prime_factorization(n : NumType | BigInt)
result = {} of (NumType | BigInt) => Int32
factors = self.trial_division(n)
2018-02-25 03:43:30 +00:00
factors.each do |f|
result[f] = 0
num = n
while num % f == 0
result[f] += 1
num /= f
end
2018-02-25 03:32:39 +00:00
end
2018-02-25 03:43:30 +00:00
result
end
2018-02-23 04:53:01 +00:00
2018-02-25 03:43:30 +00:00
def to_big_ints(num_list : Array(NumType))
num_list.map { |n| BigInt.new(n) }
2018-02-23 04:53:01 +00:00
end
2018-02-25 03:43:30 +00:00
def to_digit_list(n : NumType | BigInt)
n.to_s.chars.map { |d| d.to_i }
end
2018-02-25 03:32:39 +00:00
def palindrome?(x)
x.to_s.reverse == x.to_s
2018-02-23 04:53:01 +00:00
end
end