hensel_code 0.1.0 → 0.3.0
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/.codecov.yml +6 -0
- data/CHANGELOG.md +26 -2
- data/Gemfile.lock +1 -1
- data/README.md +472 -16
- data/lib/hensel_code/finite_padic_expansion.rb +106 -0
- data/lib/hensel_code/gadic_base.rb +86 -0
- data/lib/hensel_code/gadic_verifier.rb +36 -0
- data/lib/hensel_code/modular_arithmetic.rb +75 -0
- data/lib/hensel_code/padic_base.rb +85 -0
- data/lib/hensel_code/{tfpe_verifier.rb → padic_verifier.rb} +1 -1
- data/lib/hensel_code/polynomial.rb +103 -0
- data/lib/hensel_code/tools.rb +24 -6
- data/lib/hensel_code/truncated_finite_gadic_expansion.rb +64 -0
- data/lib/hensel_code/truncated_finite_padic_expansion.rb +21 -77
- data/lib/hensel_code/version.rb +1 -1
- data/lib/hensel_code.rb +12 -3
- metadata +11 -3
| @@ -2,39 +2,11 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module HenselCode
         | 
| 4 4 | 
             
              # truncated finite p-adic expansion hensel code class
         | 
| 5 | 
            -
              class TruncatedFinitePadicExpansion
         | 
| 6 | 
            -
                include Tools
         | 
| 7 | 
            -
                include TFPEVerifier
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                attr_accessor :prime, :exponent, :rational, :hensel_code, :n
         | 
| 10 | 
            -
                private :prime=, :exponent=, :rational=, :hensel_code=
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                def initialize(prime, exponent, number)
         | 
| 13 | 
            -
                  @prime = prime
         | 
| 14 | 
            -
                  @exponent = exponent
         | 
| 15 | 
            -
                  @n = Integer.sqrt((modulus - 1) / 2)
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  valid_number?(number)
         | 
| 18 | 
            -
                  encode
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
             | 
| 5 | 
            +
              class TruncatedFinitePadicExpansion < PAdicBase
         | 
| 21 6 | 
             
                def modulus
         | 
| 22 7 | 
             
                  prime**exponent
         | 
| 23 8 | 
             
                end
         | 
| 24 9 |  | 
| 25 | 
            -
                def numerator
         | 
| 26 | 
            -
                  rational.numerator
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                def denominator
         | 
| 30 | 
            -
                  rational.denominator
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                def to_r
         | 
| 34 | 
            -
                  decode
         | 
| 35 | 
            -
                  rational
         | 
| 36 | 
            -
                end
         | 
| 37 | 
            -
             | 
| 38 10 | 
             
                def to_i
         | 
| 39 11 | 
             
                  hensel_code
         | 
| 40 12 | 
             
                end
         | 
| @@ -43,61 +15,28 @@ module HenselCode | |
| 43 15 | 
             
                  hensel_code.to_s
         | 
| 44 16 | 
             
                end
         | 
| 45 17 |  | 
| 46 | 
            -
                def  | 
| 47 | 
            -
                   | 
| 48 | 
            -
                  encode
         | 
| 49 | 
            -
                  decode
         | 
| 50 | 
            -
                  self
         | 
| 51 | 
            -
                end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                def replace_exponent(new_exponent)
         | 
| 54 | 
            -
                  self.exponent = new_exponent
         | 
| 55 | 
            -
                  encode
         | 
| 56 | 
            -
                  decode
         | 
| 57 | 
            -
                  self
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                def replace_rational(new_rational)
         | 
| 61 | 
            -
                  self.rational = new_rational
         | 
| 62 | 
            -
                  encode
         | 
| 63 | 
            -
                  decode
         | 
| 64 | 
            -
                  self
         | 
| 65 | 
            -
                end
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                def replace_hensel_code(new_hensel_code)
         | 
| 68 | 
            -
                  self.hensel_code = new_hensel_code
         | 
| 69 | 
            -
                  decode
         | 
| 70 | 
            -
                  encode
         | 
| 71 | 
            -
                  self
         | 
| 72 | 
            -
                end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                def +(other)
         | 
| 75 | 
            -
                  valid?(other)
         | 
| 76 | 
            -
                  self.class.new prime, exponent, (hensel_code + other.hensel_code) % modulus
         | 
| 77 | 
            -
                end
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                def -(other)
         | 
| 80 | 
            -
                  valid?(other)
         | 
| 81 | 
            -
                  self.class.new prime, exponent, (hensel_code - other.hensel_code) % modulus
         | 
| 18 | 
            +
                def inspect
         | 
| 19 | 
            +
                  "<HenselCode: #{hensel_code}>"
         | 
| 82 20 | 
             
                end
         | 
| 83 21 |  | 
| 84 | 
            -
                def  | 
| 85 | 
            -
                   | 
| 86 | 
            -
                  self.class.new prime, exponent,  | 
| 22 | 
            +
                def inverse
         | 
| 23 | 
            +
                  new_hensel_code = mod_inverse(hensel_code, modulus)
         | 
| 24 | 
            +
                  self.class.new prime, exponent, new_hensel_code
         | 
| 87 25 | 
             
                end
         | 
| 88 26 |  | 
| 89 | 
            -
                 | 
| 90 | 
            -
                  valid?(other)
         | 
| 91 | 
            -
                  h2_hensel_code_inverse = mod_inverse(other.hensel_code, modulus)
         | 
| 92 | 
            -
                  self.class.new prime, exponent, (hensel_code * h2_hensel_code_inverse) % modulus
         | 
| 93 | 
            -
                end
         | 
| 27 | 
            +
                private
         | 
| 94 28 |  | 
| 95 | 
            -
                def  | 
| 96 | 
            -
                   | 
| 29 | 
            +
                def evaluate(operation, other)
         | 
| 30 | 
            +
                  if operation == "/"
         | 
| 31 | 
            +
                    other_hensel_code = mod_inverse(other.hensel_code, modulus)
         | 
| 32 | 
            +
                    op = "*"
         | 
| 33 | 
            +
                  else
         | 
| 34 | 
            +
                    other_hensel_code = other.hensel_code
         | 
| 35 | 
            +
                    op = operation
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                  self.class.new prime, exponent, hensel_code.send(op, other_hensel_code) % modulus
         | 
| 97 38 | 
             
                end
         | 
| 98 39 |  | 
| 99 | 
            -
                private
         | 
| 100 | 
            -
             | 
| 101 40 | 
             
                def valid_number?(number)
         | 
| 102 41 | 
             
                  case number
         | 
| 103 42 | 
             
                  when Rational
         | 
| @@ -111,6 +50,11 @@ module HenselCode | |
| 111 50 | 
             
                  end
         | 
| 112 51 | 
             
                end
         | 
| 113 52 |  | 
| 53 | 
            +
                def valid_hensel_code?(new_hensel_code)
         | 
| 54 | 
            +
                  message = "must be an integer up to #{modulus - 1}"
         | 
| 55 | 
            +
                  raise WrongHenselCodeInputType, message unless new_hensel_code < modulus
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 114 58 | 
             
                def encode
         | 
| 115 59 | 
             
                  denominator_inverse = mod_inverse(denominator, modulus)
         | 
| 116 60 | 
             
                  @hensel_code = (numerator * denominator_inverse) % modulus
         | 
    
        data/lib/hensel_code/version.rb
    CHANGED
    
    
    
        data/lib/hensel_code.rb
    CHANGED
    
    | @@ -13,12 +13,21 @@ module HenselCode | |
| 13 13 | 
             
              class HenselCodesWithDifferentPrimesAndExponents < StandardError; end
         | 
| 14 14 | 
             
              class HenselCodesWithDifferentExponents < StandardError; end
         | 
| 15 15 | 
             
              class IncompatibleOperandTypes < StandardError; end
         | 
| 16 | 
            +
              class NonInitializableClass < StandardError; end
         | 
| 16 17 |  | 
| 17 | 
            -
              autoload  :Tools, | 
| 18 | 
            -
              autoload  : | 
| 19 | 
            -
              autoload  : | 
| 18 | 
            +
              autoload  :Tools, "hensel_code/tools"
         | 
| 19 | 
            +
              autoload  :PAdicBase, "hensel_code/padic_base"
         | 
| 20 | 
            +
              autoload  :GAdicBase, "hensel_code/gadic_base"
         | 
| 21 | 
            +
              autoload  :Polynomial, "hensel_code/polynomial"
         | 
| 22 | 
            +
              autoload  :PAdicVerifier, "hensel_code/padic_verifier"
         | 
| 23 | 
            +
              autoload  :GAdicVerifier, "hensel_code/gadic_verifier"
         | 
| 24 | 
            +
              autoload  :ModularArithmetic, "hensel_code/modular_arithmetic"
         | 
| 25 | 
            +
              autoload  :FinitePadicExpansion, "hensel_code/finite_padic_expansion"
         | 
| 26 | 
            +
              autoload  :TruncatedFinitePadicExpansion, "hensel_code/truncated_finite_padic_expansion"
         | 
| 27 | 
            +
              autoload  :TruncatedFiniteGadicExpansion, "hensel_code/truncated_finite_gadic_expansion"
         | 
| 20 28 |  | 
| 21 29 | 
             
              # aliases for classes with long names
         | 
| 22 30 | 
             
              TFPE = TruncatedFinitePadicExpansion
         | 
| 23 31 | 
             
              HCWDPAE = HenselCodesWithDifferentPrimesAndExponents
         | 
| 32 | 
            +
              WHIT = WrongHenselCodeInputType
         | 
| 24 33 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hensel_code
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - David William Silva
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022-03- | 
| 11 | 
            +
            date: 2022-03-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: A Ruby library for homomorphically representing rational numbers as integers.
         | 
| 14 14 | 
             
            email:
         | 
| @@ -17,6 +17,7 @@ executables: [] | |
| 17 17 | 
             
            extensions: []
         | 
| 18 18 | 
             
            extra_rdoc_files: []
         | 
| 19 19 | 
             
            files:
         | 
| 20 | 
            +
            - ".codecov.yml"
         | 
| 20 21 | 
             
            - ".rubocop.yml"
         | 
| 21 22 | 
             
            - CHANGELOG.md
         | 
| 22 23 | 
             
            - Gemfile
         | 
| @@ -26,8 +27,15 @@ files: | |
| 26 27 | 
             
            - Rakefile
         | 
| 27 28 | 
             
            - codecov
         | 
| 28 29 | 
             
            - lib/hensel_code.rb
         | 
| 29 | 
            -
            - lib/hensel_code/ | 
| 30 | 
            +
            - lib/hensel_code/finite_padic_expansion.rb
         | 
| 31 | 
            +
            - lib/hensel_code/gadic_base.rb
         | 
| 32 | 
            +
            - lib/hensel_code/gadic_verifier.rb
         | 
| 33 | 
            +
            - lib/hensel_code/modular_arithmetic.rb
         | 
| 34 | 
            +
            - lib/hensel_code/padic_base.rb
         | 
| 35 | 
            +
            - lib/hensel_code/padic_verifier.rb
         | 
| 36 | 
            +
            - lib/hensel_code/polynomial.rb
         | 
| 30 37 | 
             
            - lib/hensel_code/tools.rb
         | 
| 38 | 
            +
            - lib/hensel_code/truncated_finite_gadic_expansion.rb
         | 
| 31 39 | 
             
            - lib/hensel_code/truncated_finite_padic_expansion.rb
         | 
| 32 40 | 
             
            - lib/hensel_code/version.rb
         | 
| 33 41 | 
             
            - sig/hensel_code.rbs
         |