polynomials 0.1.5 → 0.1.6

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
data/lib/polynomials.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  require 'set'
2
2
  require_relative 'term'
3
3
  require_relative 'core_ext/math'
4
+
4
5
  class Polynomial
6
+
5
7
  MinMaxMapping = { 1.0 => :max, -1.0 => :min }
6
8
  AfterextremaCurvatureMapping = { max: :right, min: :left }
7
9
  NegPosMinMaxExtremumMapping = {[1.0,-1.0] => :max,[-1.0,1.0] => :min}
@@ -35,14 +37,6 @@ class Polynomial
35
37
  return new_function
36
38
  end
37
39
 
38
- def alter
39
- new_function = self.class.new
40
- self.terms.values.each do |term|
41
- yield new_function, term
42
- end
43
- return new_function
44
- end
45
-
46
40
  def roots
47
41
  if terms.keys.none?(&:zero?)
48
42
  self.alter { |nf, term| nf.terms[term.exponent-1].coefficient = term.coefficient }.roots << 0.0
@@ -65,8 +59,8 @@ class Polynomial
65
59
  def local_extrema
66
60
  derivative = self.derivative
67
61
  max_min_extremum = Hash.new { |hash,key| hash[key] = Set.new }
68
- unless derivative.degree == 0
69
- possible_extrema = derivative.roots.sort
62
+ possible_extrema = derivative.roots.sort
63
+ unless possible_extrema.empty?
70
64
 
71
65
  samples = ([possible_extrema.first - 1] + possible_extrema.sort + [possible_extrema.last + 1]).each_cons(2).map do |before,after|
72
66
  (before + after)/2
@@ -120,6 +114,7 @@ class Polynomial
120
114
  end
121
115
 
122
116
  private
117
+
123
118
  def coefficients_till(n)
124
119
  coefficients = []
125
120
  (0..n).each do |e|
@@ -127,4 +122,14 @@ class Polynomial
127
122
  end
128
123
  return coefficients.reverse
129
124
  end
125
+
126
+ protected
127
+
128
+ def alter
129
+ new_function = self.class.new
130
+ self.terms.values.each do |term|
131
+ yield new_function, term
132
+ end
133
+ return new_function
134
+ end
130
135
  end
data/lib/term.rb CHANGED
@@ -7,11 +7,11 @@ class Term
7
7
 
8
8
  def self.parse(string)
9
9
  term = self.new
10
- float = /(\d*(?:\.\d*)?)/
11
- integer = /(\d*)/
12
- raw_data = string.match(/([-+]?)\s*#{float}\s*(x.*)?\s*\Z/)
13
- term.coefficient = (raw_data[1] + raw_data[2]).to_f
14
- term.exponent = (raw_data[3] ? (raw_data[3] =~ /x\^#{integer}/ ? $1.to_i : 1) : 0)
10
+ float = /\d*(?:\.\d*)?/
11
+ integer = /\d*/
12
+ raw_data = string.match(/(?<algebraic_sign>[-+]?)\s*(?<coefficient>#{float})?\s*(?<power>x.*)?\s*\Z/)
13
+ term.coefficient = (raw_data[:algebraic_sign] + (!raw_data[:coefficient].empty? ? raw_data[:coefficient] : "1")).to_f
14
+ term.exponent = (raw_data[:power] ? (raw_data[:power] =~ /x\^(#{integer})/ ? $1.to_i : 1) : 0)
15
15
  term
16
16
  end
17
17
 
data/polynomials.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{polynomials}
8
- s.version = "0.1.5"
8
+ s.version = "0.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Manuel Korfmann"]
@@ -50,6 +50,12 @@ class TestPolynomial < MiniTest::Unit::TestCase
50
50
  assert_equal({ max: Set[1.0/0, -1.0/0], min: Set[0.0]}, polynomial.extrema)
51
51
  end
52
52
 
53
+ def test_no_local_extrema
54
+ polynomial = Polynomial.parse('6x^6 - 5x + 50')
55
+ assert_equal({}, polynomial.local_extrema)
56
+ assert_equal({max: Set[ -1.0/0, 1.0/0 ]}, polynomial.extrema)
57
+ end
58
+
53
59
  def test_no_inflection_points
54
60
  polynomial = Polynomial.parse('1 x^4')
55
61
  assert_equal({ left: Set[-1.0/0..+1.0/0] }, polynomial.curvature_behaviour)
data/test/term_test.rb CHANGED
@@ -5,8 +5,23 @@ class TestTerm < MiniTest::Unit::TestCase
5
5
  assert_equal 0, Term.new.exponent
6
6
  end
7
7
 
8
- def test_parsing
8
+ def test_parsing_with_standard_format
9
9
  assert_equal 4, Term.parse('4x^2').coefficient
10
10
  assert_equal 2, Term.parse('4x^2').exponent
11
11
  end
12
+
13
+ def test_parsing_with_default_exponent_equal_to_one
14
+ assert_equal 1, Term.parse('1x').coefficient
15
+ assert_equal 1, Term.parse('1x').exponent
16
+ end
17
+
18
+ def test_parsing_with_default_coefficient_equal_to_one
19
+ assert_equal 1.0, Term.parse('x^6').coefficient
20
+ assert_equal 6, Term.parse('x^6').exponent
21
+ end
22
+
23
+ def test_parsing_variable_omitted
24
+ assert_equal 6, Term.parse('6').coefficient
25
+ assert_equal 0, Term.parse('6').exponent
26
+ end
12
27
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 5
9
- version: 0.1.5
8
+ - 6
9
+ version: 0.1.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Manuel Korfmann
@@ -128,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- hash: -856232510255966388
131
+ hash: 1846189921572599385
132
132
  segments:
133
133
  - 0
134
134
  version: "0"