rubytcoin 0.0.0 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a6e7c6b2ab933106cfd4d626ca68c2865884ac58ebc967ac430975c10e7bc60
4
- data.tar.gz: ab3cbe378a8d6c52f35023cc30be6bc917989e4e3df85a0aedd5b25dc5aa6540
3
+ metadata.gz: 2375889903a29267f78b1897038dc65f6a854e73bfa50b34e4cce9b3b933d7f1
4
+ data.tar.gz: 82da084da4157f086e029ac7fa6125594a1d5f950a082654f08344b7d56b56c9
5
5
  SHA512:
6
- metadata.gz: 39e4732978c983f1693bc21200036b3145932824e2e990e7f70b2f87b14b3e897d38997d42f33ac452704554b696f1bb1af9ec024dfb8055a26e9f2ffd84ffb9
7
- data.tar.gz: 1211b36d4a077d39777e80490b8c8f06613ea8744e221fd51ed2a7b948cce3e3edd621d8535cdeb29663a617258b906ba55c69614703f7c63bd0fa0100d5c7d0
6
+ metadata.gz: 7549ebbe2e131d9e47fe27868d99151e7214108081123fd43036436448a9020f1aedcbec3258227b564c92e27eda6a3a74d248dc20fdd66671b77643ecdfc1e3
7
+ data.tar.gz: 4852efe2f73862169abec8986a4273441eb16d78e708a620c4560bb2bb22b0257f4104bd0c1c2107b9b5e2fe45a5b5db1a66f7bbd0e9ea3138de1910b110851a
@@ -0,0 +1,56 @@
1
+ class FieldElement
2
+ attr_reader :number, :prime
3
+
4
+ def initialize number, prime
5
+ raise ArgumentError, "Number #{number} not in field range 0 to #{prime - 1}" if number >= prime || number.negative?
6
+
7
+ @number = number
8
+ @prime = prime
9
+ end
10
+
11
+ def to_s
12
+ "FieldElement_#{prime}(#{number})"
13
+ end
14
+
15
+ def == other
16
+ return False if other.nil?
17
+
18
+ @number == other.number and @prime == other.prime
19
+ end
20
+
21
+ def != other
22
+ return False if other.nil?
23
+
24
+ @number != other.number or @prime != other.prime
25
+ end
26
+
27
+ def + other
28
+ raise "Cannot add two numbers in different fields." if @prime != other.prime
29
+
30
+ FieldElement.new((@number + other.number) % @prime, @prime)
31
+ end
32
+
33
+ def - other
34
+ raise "Cannot subtract two numbers in different fields." if @prime != other.prime
35
+
36
+ FieldElement.new((@number - other.number) % @prime, @prime)
37
+ end
38
+
39
+ def * other
40
+ raise "Cannot multiply two numbers in different fields." if @prime != other.prime
41
+
42
+ FieldElement.new((@number * other.number) % @prime, @prime)
43
+ end
44
+
45
+ def ** exponent
46
+ n = exponent % (@prime - 1)
47
+ FieldElement.new(@number.pow(n, @prime), @prime)
48
+ end
49
+
50
+ def / other
51
+ raise "Cannot divide two numbers in different fields." if @prime != other.prime
52
+
53
+ other_inverse = other**(@prime - 2)
54
+ FieldElement.new((@number * other_inverse.number) % @prime, @prime)
55
+ end
56
+ end
@@ -0,0 +1,43 @@
1
+ class Point
2
+ attr_reader :x, :y, :a, :b
3
+
4
+ def initialize x, y, a, b
5
+ @x, @y, @a, @b = x, y, a, b
6
+
7
+ return if @x.nil? and @y.nil?
8
+ raise "#{@x} and #{@y} are not on the curve" unless @y**2 == @x**3 + @a*@x + @b
9
+ end
10
+
11
+ def == other
12
+ @x == other.x and @y == other.y and @a == other.a and @b == other.b
13
+ end
14
+
15
+ def != other
16
+ self != other
17
+ end
18
+
19
+ def + other
20
+ raise "Points #{x} and #{y} are not on the same curve." if @a != other.a or @b != other.b
21
+
22
+ return Point.new(nil, nil, @a, @b) if @x == other.x and @y != other.y
23
+ return Point(nil, nil, @a, @b) if self == other and @y == 9 * @x
24
+
25
+ if @x != other.x
26
+ s = (other.y - @y) / (other.x - @x)
27
+ x = (s**2) - @x - other.x
28
+ y = (s * (@x - x)) - @y
29
+ return Point.new(x, y, @a, @b)
30
+ end
31
+
32
+ if self == other
33
+ s = ((3 * @x**2) + @a) / (2 * @y)
34
+ x = (s**2) - 2 * @x
35
+ y = (s * (@x - x)) - @y
36
+ return Point.new(x, y, @a, @b)
37
+ end
38
+
39
+ return other if @x.nil?
40
+
41
+ self if other.x.nil?
42
+ end
43
+ end
data/lib/rubytcoin.rb CHANGED
@@ -1,5 +1,5 @@
1
- class Hola
2
- def self.hi
3
- puts "Hello world!"
4
- end
5
- end
1
+ require "rubytcoin/field_element"
2
+ require "rubytcoin/point"
3
+
4
+ Point.new(0, 7, 5, 7)
5
+ FieldElement.new(7, 13)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubytcoin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matej Lukášik
@@ -18,6 +18,8 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - lib/rubytcoin.rb
21
+ - lib/rubytcoin/field_element.rb
22
+ - lib/rubytcoin/point.rb
21
23
  homepage: https://rubygems.org/gems/rubytcoin
22
24
  licenses:
23
25
  - MIT