figurate_numbers 1.4.2 β 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +21 -0
- data/README.md +26 -18
- data/docs/ERRATA.md +1 -1
- data/docs/METHODS.md +15 -3
- data/lib/figurate_numbers/arith_transform.rb +47 -0
- data/lib/figurate_numbers/utils/modn_utils.rb +23 -0
- data/lib/figurate_numbers/utils/padic_utils.rb +54 -0
- data/lib/figurate_numbers/version.rb +1 -1
- data/lib/figurate_numbers.rb +3 -0
- metadata +7 -3
- data/lib/figurate_numbers/p_adic_utils/p_adic_utils.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 615bd4bfc8ce65a4075fb7b9456ed793e8bedaa3157a6875accdd59f86b592ec
|
4
|
+
data.tar.gz: 4f3f33115e5c40912b0730be116757ff0211703e89e2e0b27315d35f276283ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c097387a659972438771724497a87c1bcd28f1a6714fa619d97dc7bd2dda137ae4f0531745834637423ae1da6d3588482ff0cefe2d9da203968e63477cdb723
|
7
|
+
data.tar.gz: d483f180c9aea3c43520301fca605c8118be359e47b73e2817f2cae9afe2733b375ca3f78ab551cc3be276f8e30953b1e3585163064b2ebbd3b510cd245f2536
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2024 Edgar Armando Delgado Vega
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
CHANGED
@@ -27,15 +27,17 @@ Figurate Numbers implements 241 infinite sequences using the Enumerator class in
|
|
27
27
|
|
28
28
|
The sequences are organized following the structure of the *Figurate Numbers* book:
|
29
29
|
|
30
|
-
- π¦ **PlaneFigurateNumbers
|
31
|
-
- π₯ **SpaceFigurateNumbers
|
32
|
-
- π¨ **MultiDimensionalFigurateNumbers
|
33
|
-
- 𧬠**Zoo of figurate-related numbers
|
30
|
+
- π¦ **PlaneFigurateNumbers**: 79 sequences (2D)
|
31
|
+
- π₯ **SpaceFigurateNumbers**: 86 sequences (3D)
|
32
|
+
- π¨ **MultiDimensionalFigurateNumbers**: 70 sequences (4D and beyond)
|
33
|
+
- 𧬠**Zoo of figurate-related numbers**: 6 additional sequences *(included in the MultiDimensional module)*
|
34
|
+
- βοΈ **ArithTransform**: p-adic transformations and other arithmetic operations
|
34
35
|
|
35
|
-
> π Explore the detailed list of figurate numbers [here π.](docs/METHODS.md)
|
36
36
|
|
37
37
|
## π§° How to use in Ruby
|
38
38
|
|
39
|
+
### Version 1.5.0
|
40
|
+
|
39
41
|
```rb
|
40
42
|
require 'figurate_numbers'
|
41
43
|
|
@@ -48,45 +50,51 @@ f.next
|
|
48
50
|
f.next
|
49
51
|
f.next
|
50
52
|
```
|
51
|
-
|
52
|
-
Starting with version **1.4.0**, you can also call methods directly from their respective classes. This allows you to work with figurate numbers grouped by their geometric dimension:
|
53
|
+
Starting from version **1.5.0**, `figurate_numbers` not only supports global access via `FigurateNumbers` and the use of specific classes for separate access, but also introduces new p-adic transformations and other mathematical operations that can be applied directly to sequences.
|
53
54
|
|
54
55
|
```rb
|
55
|
-
PlaneFigurateNumbers.polygonal(
|
56
|
+
PlaneFigurateNumbers.polygonal(19)
|
56
57
|
SpaceFigurateNumbers.rhombic_dodecahedral
|
57
58
|
MultiDimensionalFigurateNumbers.six_dimensional_hyperoctahedron
|
59
|
+
seq = MultiDimensionalFigurateNumbers.five_dimensional_hypercube.take(15)
|
60
|
+
ArithTransform.ring_padic_val(seq, 3)
|
58
61
|
```
|
62
|
+
> π Explore the detailed list of figurate numbers and arithmetic transformations [here π.](https://github.com/edelveart/figurate_numbers/blob/main/docs/METHODS.md)
|
59
63
|
|
60
64
|
## πΆ How to use in Sonic Pi
|
61
65
|
|
62
|
-
|
63
|
-
|
64
|
-
Starting from version **1.4.0**, you can use the library globally through `FigurateNumbers`to access all sequences, or you can use the specific classes mentioned above for separate access.
|
65
|
-
The main change compared to version **1.3.0** is that you now need to import the file using **require** instead of **run_file**; otherwise, it will not function.
|
66
|
+
Simply copy the entry point path from the `lib/figurate_numbers.rb` file where the *gem* is installed.
|
66
67
|
|
67
68
|
```rb
|
68
69
|
require "<PATH>"
|
70
|
+
|
69
71
|
pol_num = FigurateNumbers.polygonal(8)
|
70
72
|
350.times do
|
71
73
|
play pol_num.next % 12 * 7 # Some mathematical function or transformation
|
72
74
|
sleep 0.125
|
73
75
|
end
|
74
|
-
```
|
75
76
|
|
76
|
-
|
77
|
+
amp_seq = SpaceFigurateNumbers.centered_hendecagonal_pyramidal
|
78
|
+
100.times do
|
79
|
+
sample :bd_sone, amp: ArithTransform.padic_norm(amp_seq.next, 3) # p-adic amplitude control
|
80
|
+
sleep 0.25
|
81
|
+
end
|
82
|
+
```
|
77
83
|
|
78
84
|
### Version 1.3.0 (legacy)
|
79
85
|
|
86
|
+
The main change introduced after version **1.3.0** is that you must now import the file using **require** instead of **run_file**; otherwise, it will not function.
|
87
|
+
|
80
88
|
See discussion in the [**Sonic Pi community thread right here!**](https://in-thread.sonic-pi.net/t/figurate-numbers-for-sonic-pi-new-ruby-gem-for-infinite-number-sequences-and-patterns/8962)
|
81
89
|
|
82
|
-
## π List of
|
90
|
+
## π List of Sequences in `figurate_numbers` and Arithmetic Transformations Methods
|
83
91
|
|
84
|
-
Explore the complete list of figurate number sequences
|
92
|
+
Explore the complete list of figurate number sequences:
|
85
93
|
|
86
|
-
- [View all implemented methods and sequences π](docs/METHODS.md)
|
94
|
+
- [View all implemented methods and sequences π](https://github.com/edelveart/figurate_numbers/blob/main/docs/METHODS.md)
|
87
95
|
|
88
96
|
## π Book Errata
|
89
97
|
|
90
98
|
Corrections to formulas and data found in *Figurate Numbers* (2012):
|
91
99
|
|
92
|
-
- [See full list of known errata π](docs/ERRATA.md)
|
100
|
+
- [See full list of known errata π](https://github.com/edelveart/figurate_numbers/blob/main/docs/ERRATA.md)
|
data/docs/ERRATA.md
CHANGED
data/docs/METHODS.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
# List of
|
1
|
+
# List of Sequences in `figurate_numbers` and Arithmetic Transformations Methods
|
2
2
|
|
3
3
|
### Table of Contents
|
4
4
|
- π¦ [Plane Figurate Numbers](#1-plane-figurate-numbers)
|
5
5
|
- π₯ [Space Figurate Numbers](#2-space-figurate-numbers)
|
6
6
|
- π¨ [Multidimensional Figurate Numbers](#3-multidimensional-figurate-numbers)
|
7
|
-
- 𧬠[Zoo of figurate-related numbers](#
|
7
|
+
- 𧬠[Zoo of figurate-related numbers](#4-zoo-of-figurate-related-numbers)
|
8
|
+
- βοΈ [Arithmetic Transformations](#5-arithmetic-transformations)
|
8
9
|
|
9
10
|
> Note that `=` means that you can call the same sequence with different names.
|
10
11
|
|
@@ -252,7 +253,7 @@
|
|
252
253
|
69. `generalized_k_dimensional_centered_hyperoctahedron(k, left_index = 0)[provisional symmetry]`
|
253
254
|
70. `generalized_nexus(k, left_index = 0) [even or odd dimension only changes sign]`
|
254
255
|
|
255
|
-
###
|
256
|
+
### 4. Zoo of figurate-related numbers
|
256
257
|
|
257
258
|
1. `cuban_numbers = cuban_prime_numbers`
|
258
259
|
2. `quartan_numbers [Needs to improve the algorithmic complexity for n > 70]`
|
@@ -260,3 +261,14 @@
|
|
260
261
|
4. `carmichael_numbers [Needs to improve the algorithmic complexity for n > 20]`
|
261
262
|
4. `stern_prime_numbers(infty = false) [Quick calculations up to 8 terms]`
|
262
263
|
5. `apocalyptic_numbers`
|
264
|
+
|
265
|
+
### 5. Arithmetic Transformations
|
266
|
+
|
267
|
+
1. `ArithTransform.n_residue(n, pow, mod)`
|
268
|
+
2. `ArithTransform.pc_inversion(n, mod)`
|
269
|
+
3. `ArithTransform.padic_val(n, p)`
|
270
|
+
4. `ArithTransform.ring_padic_val(seq, p)`
|
271
|
+
5. `ArithTransform.padic_norm(n, p)`
|
272
|
+
6. `ArithTransform.ring_padic_norm(seq, p)`
|
273
|
+
7. `ArithTransform.padic_expansion(n, p, precision = 11, reverse: false)`
|
274
|
+
8. `ArithTransform.ring_padic_expansion(seq, p, precision = 11, reverse: false)`
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative './utils/padic_utils'
|
2
|
+
require_relative './utils/modn_utils'
|
3
|
+
|
4
|
+
module FigurateNumbers
|
5
|
+
# Provides arithmetic methods for transforming and analyzing figurate number sequences.
|
6
|
+
module ArithTransform
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def n_residue(n, pow, mod)
|
10
|
+
ModNUtils.q_residues(n, pow, mod)
|
11
|
+
end
|
12
|
+
|
13
|
+
def pc_inversion(n, mod)
|
14
|
+
ModNUtils.inversion(n, mod)
|
15
|
+
end
|
16
|
+
|
17
|
+
def padic_val(n, p)
|
18
|
+
PAdicUtils.padic_valuation(n, p)
|
19
|
+
end
|
20
|
+
|
21
|
+
def ring_padic_val(seq, p)
|
22
|
+
seq.map do |delta|
|
23
|
+
PAdicUtils.padic_valuation(delta, p)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def padic_norm(n, p)
|
28
|
+
PAdicUtils.padic_norm(n, p)
|
29
|
+
end
|
30
|
+
|
31
|
+
def ring_padic_norm(seq, p)
|
32
|
+
seq.map do |delta|
|
33
|
+
PAdicUtils.padic_norm(delta, p)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def padic_expansion(n, p, precision = 11, reverse: false)
|
38
|
+
PAdicUtils.padic_expansion(n, p, precision, reverse)
|
39
|
+
end
|
40
|
+
|
41
|
+
def ring_padic_expansion(seq, p, precision = 11, reverse: false)
|
42
|
+
seq.map do |delta|
|
43
|
+
PAdicUtils.padic_expansion(delta, p, precision, reverse)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module FigurateNumbers
|
2
|
+
# Provides modular arithmetic methods (mod n) for transforming figurate number sequences.
|
3
|
+
module ModNUtils
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def n_power(n, power)
|
7
|
+
n.pow(power)
|
8
|
+
end
|
9
|
+
|
10
|
+
def mod_reduc(n, mod)
|
11
|
+
n % mod
|
12
|
+
end
|
13
|
+
|
14
|
+
def q_residues(n, power, mod)
|
15
|
+
mod_reduc(n_power(n, power), mod)
|
16
|
+
end
|
17
|
+
|
18
|
+
def inversion(n, mod)
|
19
|
+
inv = n * -1
|
20
|
+
mod_reduc(inv, mod)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'prime'
|
2
|
+
|
3
|
+
module FigurateNumbers
|
4
|
+
# Module providing p-adic methods for transforming
|
5
|
+
# sequences of figurate numbers.
|
6
|
+
module PAdicUtils
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def padic_valuation(base_ten_number, p)
|
10
|
+
raise "#{p} is not a prime number" unless Prime.prime?(p)
|
11
|
+
|
12
|
+
index = 0
|
13
|
+
return index if base_ten_number < 1
|
14
|
+
|
15
|
+
while base_ten_number % (p**index) == 0 # rubocop:disable Style/NumericPredicate,Style/WhileUntilModifier
|
16
|
+
index += 1
|
17
|
+
end
|
18
|
+
index - 1
|
19
|
+
end
|
20
|
+
|
21
|
+
def padic_norm(base_ten_number, p)
|
22
|
+
return 0 if base_ten_number == 0 # rubocop:disable Style/NumericPredicate
|
23
|
+
|
24
|
+
power = padic_valuation(base_ten_number, p)
|
25
|
+
1.0 / p**power
|
26
|
+
end
|
27
|
+
|
28
|
+
def padic_expansion(base_ten_number, p, precision = 11, reverse_trim = false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Style/OptionalBooleanParameter
|
29
|
+
inverse_limit_arr = []
|
30
|
+
(1...precision).each do |index|
|
31
|
+
power = p**index
|
32
|
+
inverse_limits = ((base_ten_number % power) + power) % power
|
33
|
+
inverse_limit_arr << inverse_limits
|
34
|
+
end
|
35
|
+
p_adic_expansion_array = [inverse_limit_arr[0]]
|
36
|
+
|
37
|
+
(0...(precision - 2)).each do |index|
|
38
|
+
a1 = inverse_limit_arr[index + 1]
|
39
|
+
a0 = inverse_limit_arr[index]
|
40
|
+
power = p**(index + 1)
|
41
|
+
digits = (a1 - a0) / power
|
42
|
+
p_adic_expansion_array << digits
|
43
|
+
end
|
44
|
+
|
45
|
+
if reverse_trim
|
46
|
+
reversed = p_adic_expansion_array.reverse
|
47
|
+
first_nonzero_index = reversed.index { |digit| digit != 0 } || 0
|
48
|
+
reversed[first_nonzero_index..-1]
|
49
|
+
else
|
50
|
+
p_adic_expansion_array
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/figurate_numbers.rb
CHANGED
@@ -2,13 +2,16 @@ require_relative 'figurate_numbers/version'
|
|
2
2
|
require_relative 'figurate_numbers/plane_figurate_numbers'
|
3
3
|
require_relative 'figurate_numbers/space_figurate_numbers'
|
4
4
|
require_relative 'figurate_numbers/multidimensional_figurate_numbers'
|
5
|
+
require_relative 'figurate_numbers/arith_transform'
|
5
6
|
|
6
7
|
module FigurateNumbers
|
7
8
|
extend PlaneFigurateNumbers
|
8
9
|
extend SpaceFigurateNumbers
|
9
10
|
extend MultiDimensionalFigurateNumbers
|
11
|
+
extend ArithTransform
|
10
12
|
end
|
11
13
|
|
12
14
|
PlaneFigurateNumbers = FigurateNumbers::PlaneFigurateNumbers
|
13
15
|
SpaceFigurateNumbers = FigurateNumbers::SpaceFigurateNumbers
|
14
16
|
MultiDimensionalFigurateNumbers = FigurateNumbers::MultiDimensionalFigurateNumbers
|
17
|
+
ArithTransform = FigurateNumbers::ArithTransform
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: figurate_numbers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edgar Armando Delgado Vega
|
@@ -18,25 +18,29 @@ email:
|
|
18
18
|
executables: []
|
19
19
|
extensions: []
|
20
20
|
extra_rdoc_files:
|
21
|
+
- LICENSE
|
21
22
|
- README.md
|
22
23
|
- docs/ERRATA.md
|
23
24
|
- docs/METHODS.md
|
24
25
|
files:
|
26
|
+
- LICENSE
|
25
27
|
- README.md
|
26
28
|
- docs/ERRATA.md
|
27
29
|
- docs/METHODS.md
|
28
30
|
- lib/figurate_numbers.rb
|
31
|
+
- lib/figurate_numbers/arith_transform.rb
|
29
32
|
- lib/figurate_numbers/multidimensional_figurate_numbers.rb
|
30
|
-
- lib/figurate_numbers/p_adic_utils/p_adic_utils.rb
|
31
33
|
- lib/figurate_numbers/plane_figurate_numbers.rb
|
32
34
|
- lib/figurate_numbers/space_figurate_numbers.rb
|
35
|
+
- lib/figurate_numbers/utils/modn_utils.rb
|
36
|
+
- lib/figurate_numbers/utils/padic_utils.rb
|
33
37
|
- lib/figurate_numbers/utils/utils.rb
|
34
38
|
- lib/figurate_numbers/version.rb
|
35
39
|
homepage: https://github.com/edelveart/figurate_numbers
|
36
40
|
licenses:
|
37
41
|
- MIT
|
38
42
|
metadata:
|
39
|
-
documentation_uri: https://www.rubydoc.info/gems/figurate_numbers
|
43
|
+
documentation_uri: https://www.rubydoc.info/gems/figurate_numbers/
|
40
44
|
source_code_uri: https://github.com/edelveart/figurate_numbers/
|
41
45
|
homepage_uri: https://github.com/edelveart/figurate_numbers
|
42
46
|
rdoc_options:
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# module PAdicUtils
|
2
|
-
# def self.potence(exponent)
|
3
|
-
# # Este mΓ©todo modificarΓ‘ el arreglo de nΓΊmeros aplicando la potencia
|
4
|
-
# map { |num| num**exponent }
|
5
|
-
# end
|
6
|
-
# def self.p_adic_valuation(base_ten_number, base_p_number)
|
7
|
-
# m = 0
|
8
|
-
# return m if base_ten_number < 1
|
9
|
-
# while base_ten_number % (base_p_number ** m) == 0
|
10
|
-
# m += 1
|
11
|
-
# end
|
12
|
-
# m - 1
|
13
|
-
# end
|
14
|
-
|
15
|
-
# def self.to_p_adic_valuation(arr, p)
|
16
|
-
# arr.lazy.collect { |fignum| p_adic_valuation(fignum, p) }
|
17
|
-
# end
|
18
|
-
# end
|
19
|
-
|
20
|
-
|
21
|
-
# puts PAdicUtils.p_adic_valuation(96, 2)
|
22
|
-
# # export const pAdicValuation = (baseTenNumber: number, baseNumber: number): number => {
|
23
|
-
# # let index = 0;
|
24
|
-
# # if (baseTenNumber < 1) return index;
|
25
|
-
# # while (baseTenNumber % (baseNumber ** index) === 0) index++;
|
26
|
-
# # return index - 1;
|
27
|
-
# # }
|