Module: FigurateNumbers::PAdicUtils

Extended by:
PAdicUtils
Included in:
PAdicUtils
Defined in:
lib/figurate_numbers/utils/padic_utils.rb

Overview

Module providing p-adic methods for transforming sequences of figurate numbers.

Instance Method Summary collapse

Instance Method Details

#padic_expansion(base_ten_number, p, precision = 11, reverse_trim = false) ⇒ Object

rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Style/OptionalBooleanParameter



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/figurate_numbers/utils/padic_utils.rb', line 28

def padic_expansion(base_ten_number, p, precision = 11, reverse_trim = false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Style/OptionalBooleanParameter
  inverse_limit_arr = []
  (1...precision).each do |index|
    power = p**index
    inverse_limits = ((base_ten_number % power) + power) % power
    inverse_limit_arr << inverse_limits
  end
  p_adic_expansion_array = [inverse_limit_arr[0]]

  (0...(precision - 2)).each do |index|
    a1 = inverse_limit_arr[index + 1]
    a0 = inverse_limit_arr[index]
    power = p**(index + 1)
    digits = (a1 - a0) / power
    p_adic_expansion_array << digits
  end

  if reverse_trim
    reversed = p_adic_expansion_array.reverse
    first_nonzero_index = reversed.index { |digit| digit != 0 } || 0
    reversed[first_nonzero_index..-1]
  else
    p_adic_expansion_array
  end
end

#padic_norm(base_ten_number, p) ⇒ Object



21
22
23
24
25
26
# File 'lib/figurate_numbers/utils/padic_utils.rb', line 21

def padic_norm(base_ten_number, p)
  return 0 if base_ten_number == 0 # rubocop:disable Style/NumericPredicate

  power = padic_valuation(base_ten_number, p)
  1.0 / p**power
end

#padic_valuation(base_ten_number, p) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
# File 'lib/figurate_numbers/utils/padic_utils.rb', line 9

def padic_valuation(base_ten_number, p)
  raise "#{p} is not a prime number" unless Prime.prime?(p)

  index = 0
  return index if base_ten_number < 1

  while base_ten_number % (p**index) == 0 # rubocop:disable Style/NumericPredicate,Style/WhileUntilModifier
    index += 1
  end
  index - 1
end