mathrix-rails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3e6d1c1ef7ab4ff5dd7b7e8a444a90b97d734a8e
4
+ data.tar.gz: 7437f39820aa79d2203b210fb222175cb3772765
5
+ SHA512:
6
+ metadata.gz: b50a7f3bdb0d324ddc33d764802a334e7cf1c3867199a4683d536bcfeb5d310936d676158d6749503d9bb1f6825a5da6abf46ffaeceb11f16a52d47294e65544
7
+ data.tar.gz: 43f8df145d5141ee56f06ede4ea29231f899f80561ab8960e0968f26c3e30b1024be631c0ccf3320a8c877af5c417224d34b591430f2d8942c1892dce4b86d29
@@ -0,0 +1,20 @@
1
+ Copyright 2015
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,24 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'JMathsRails'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+ load 'rails/tasks/statistics.rake'
20
+
21
+
22
+
23
+ Bundler::GemHelper.install_tasks
24
+
@@ -0,0 +1,3 @@
1
+ //= require_directory ./lib
2
+ //= require_tree ./lib
3
+ //= require_tree .
@@ -0,0 +1,33 @@
1
+ (function($) {
2
+ "use strict";
3
+
4
+ try {
5
+ Object.defineProperties($.prototype, {
6
+
7
+ areMultiples: {
8
+ value: function() {
9
+ var
10
+ clone = this.clone();
11
+
12
+ clone.shift();
13
+ return Number.prototype.areMultiples.apply(this[0], clone);
14
+ }
15
+ },
16
+
17
+ min: {
18
+ value: function() {
19
+ return Math.min.apply(null, this);
20
+ }
21
+ },
22
+
23
+ max: {
24
+ value: function() {
25
+ return Math.max.apply(null, this);
26
+ }
27
+ }
28
+
29
+ });
30
+
31
+ } catch(e) {}
32
+
33
+ })(Array);
@@ -0,0 +1,140 @@
1
+ (function($) {
2
+ "use strict";
3
+
4
+
5
+ try {
6
+ Object.defineProperties($, {
7
+
8
+ // greatest common divisor
9
+ GCD: {
10
+ value: function() {
11
+ var
12
+ iterator,
13
+ primeFactor = 2,
14
+ product = 1,
15
+ i = 0,
16
+ amount = 0,
17
+ remains = [],
18
+
19
+ everyoneAreMultipleOf = function(remains, factor) {
20
+ var
21
+ i = 0;
22
+
23
+ while(i < remains.length) {
24
+ if (!remains[i++].multipleOf(factor)) {
25
+ return false;
26
+ }
27
+ }
28
+
29
+ return true;
30
+ },
31
+
32
+ callback = function(r) {
33
+ primeFactor = iterator.primeFactor();
34
+ if(everyoneAreMultipleOf(r, primeFactor)) {
35
+ product *= primeFactor;
36
+ }
37
+ },
38
+
39
+ euclidesAlgorithm = function(a, b) {
40
+ var
41
+ rest = b;
42
+
43
+ while(rest !== 0) {
44
+ rest = a % b;
45
+ a = b;
46
+ b = rest;
47
+ }
48
+
49
+ return a;
50
+ };
51
+
52
+ remains = Array.from(arguments);
53
+ remains = remains.uniq();
54
+ if(remains.length == 1) {
55
+ return remains[0];
56
+ }
57
+
58
+ // properties
59
+
60
+ // se todos os números forem múltiplos entre si, o MDC será menor deles
61
+ if(remains.areMultiples()) {
62
+ return remains.min();
63
+ }
64
+
65
+ // o algorítmo de Euclides é mais eficiente para calcular o MDC entre apenas dois números
66
+ if(remains.length == 2) {
67
+ return euclidesAlgorithm(remains[0], remains[1]);
68
+ }
69
+
70
+ // dois números primos não são múltiplos entre si
71
+ i = 0;
72
+ while(true) {
73
+ if((remains[i]).isPrime()) {amount++;}
74
+ if(amount >= 2) {return 1;}
75
+ if(i == remains.length -1) {break;}
76
+ i++;
77
+ }
78
+
79
+ iterator = Math.PrimeFactorsDecomposition.Proxy
80
+ .new(remains);
81
+ iterator.decompose(callback);
82
+
83
+ return product;
84
+ }
85
+ },
86
+
87
+ // least common multiple
88
+ LCM: {
89
+ value: function() {
90
+ var
91
+ iterator,
92
+ primeFactor = 2,
93
+ remains = [],
94
+ product = 1,
95
+
96
+ callback = function() {
97
+ primeFactor = iterator.primeFactor();
98
+ product *= primeFactor;
99
+ },
100
+
101
+ for2Factors = function(numbers) {
102
+ var
103
+ product = 1,
104
+
105
+ callback = function(v) {
106
+ product *= v;
107
+ };
108
+
109
+ numbers.forEach(callback);
110
+
111
+ return product/Math.GCD.apply(null, numbers);
112
+ };
113
+
114
+ remains = Array.from(arguments);
115
+ remains = remains.uniq();
116
+ if(remains.length == 1) {
117
+ return remains[0];
118
+ }
119
+
120
+ if(remains.areMultiples()) {
121
+ return remains.max();
122
+ }
123
+
124
+ if(remains.length == 2) {
125
+ return for2Factors(remains);
126
+ }
127
+
128
+ iterator = Math.PrimeFactorsDecomposition.Proxy
129
+ .new(remains);
130
+ iterator.decompose(callback);
131
+
132
+ return product;
133
+ }
134
+ }
135
+
136
+ });
137
+
138
+ } catch(e) {}
139
+
140
+ })(Math);
@@ -0,0 +1,219 @@
1
+ var
2
+ Iterable,
3
+ Map;
4
+
5
+ (function($module) {
6
+ "use strict";
7
+
8
+ var
9
+ Iterator_ = function(collection) {
10
+ var
11
+ iteration = -1,
12
+ primeFactor = 2,
13
+ remains = collection.clone(),
14
+ primeFactors = [],
15
+ quotients = [],
16
+ decomposition = new Map(),
17
+
18
+ hasSomeMultipleOf = function(remains, factor) {
19
+ var
20
+ i = 0;
21
+
22
+ while(i < remains.length) {
23
+ if (remains[i++].multipleOf(factor)) {
24
+ return true;
25
+ }
26
+ }
27
+
28
+ return false;
29
+ },
30
+
31
+ resolveFactor = function(remains) {
32
+ if (remains.amount(1) < remains.length) {
33
+ while(!hasSomeMultipleOf(remains, primeFactor)) {
34
+ primeFactor = primeFactor.nextPrimeFactor();
35
+ }
36
+ } else {
37
+ primeFactor = 1;
38
+ }
39
+
40
+ return primeFactor;
41
+ },
42
+
43
+ resolveDecomposition = function(reference) {
44
+ if (reference.hasNext()) {
45
+ reference.decompose();
46
+ }
47
+ };
48
+
49
+ this.primeFactor = function() {
50
+ return primeFactor;
51
+ };
52
+
53
+ this.next = function() {
54
+ var
55
+ i,
56
+ clone,
57
+ iterator = Iterable.Proxy.new(remains),
58
+
59
+ callback = function(n) {
60
+ i = iterator.index();
61
+ if (n.multipleOf(primeFactor)) {
62
+ remains[i] /= primeFactor;
63
+ }
64
+ };
65
+
66
+ if (this.hasNext()) {
67
+ iteration += 1;
68
+ if(iteration === 0) {
69
+ return remains;
70
+ }
71
+
72
+ primeFactors.push(primeFactor);
73
+
74
+ iterator.each(callback);
75
+
76
+ resolveFactor(remains);
77
+
78
+ clone = remains.clone();
79
+ decomposition.set(clone, primeFactor);
80
+ quotients.push(clone);
81
+
82
+ return remains;
83
+ }
84
+
85
+ return undefined;
86
+
87
+ };
88
+
89
+ this.hasNext = function() {
90
+ return primeFactor > 1;
91
+ };
92
+
93
+ this.primeFactors = function() {
94
+ resolveDecomposition(this);
95
+
96
+ return primeFactors;
97
+ };
98
+
99
+ this.reset = function() {
100
+ remains = collection.clone();
101
+ iteration = -1;
102
+ primeFactor = 2;
103
+ };
104
+
105
+ this.finalize = function() {
106
+ primeFactor = 1;
107
+ };
108
+
109
+ this.decompose = function(callback) {
110
+ if (typeof callback != "function") {
111
+ callback = function(){};
112
+ }
113
+
114
+ while (this.hasNext(remains)) {
115
+ callback.call(collection, this.next());
116
+ }
117
+
118
+ return decomposition;
119
+ };
120
+
121
+ this.decomposition = function() {
122
+ resolveDecomposition(this);
123
+
124
+ return decomposition;
125
+ };
126
+
127
+ this.quotients = function() {
128
+ resolveDecomposition(this);
129
+
130
+ return quotients;
131
+ };
132
+
133
+ resolveFactor(remains);
134
+ decomposition.set(remains.clone(), primeFactor);
135
+ };
136
+
137
+ try {
138
+ Object.defineProperties($module, {
139
+ PrimeFactorsDecomposition: {
140
+ value: {}
141
+ }
142
+ });
143
+ } catch(e) {}
144
+
145
+ try {
146
+ Object.defineProperties($module.PrimeFactorsDecomposition, {
147
+ Proxy: {
148
+ value: {}
149
+ }
150
+ });
151
+ } catch(e) {}
152
+
153
+ try {
154
+ Object.defineProperties($module.PrimeFactorsDecomposition.Proxy, {
155
+ new: {
156
+ value: function(numbers, callback) {
157
+ var
158
+ collection,
159
+ _iterator,
160
+ self = $module.PrimeFactorsDecomposition.Proxy,
161
+ argumentsAsArray = Array.from(arguments);
162
+
163
+ if (!(this instanceof self.new)) {
164
+ return new self.new(numbers, callback);
165
+ }
166
+
167
+ if (typeof argumentsAsArray[argumentsAsArray.length - 1] ==
168
+ "function") {
169
+ collection = argumentsAsArray
170
+ .slice(0, argumentsAsArray.length - 1);
171
+ } else {
172
+ collection = argumentsAsArray.flatten().compact();
173
+ }
174
+
175
+ _iterator = new Iterator_(collection);
176
+
177
+ this.primeFactor = function() {
178
+ return _iterator.primeFactor();
179
+ };
180
+
181
+ this.primeFactors = function() {
182
+ return _iterator.primeFactors();
183
+ };
184
+
185
+ this.next = function() {
186
+ return _iterator.next();
187
+ };
188
+
189
+ this.reset = function() {
190
+ _iterator.reset();
191
+ };
192
+
193
+ this.finalize = function() {
194
+ _iterator.finalize();
195
+ };
196
+
197
+ this.hasNext = function() {
198
+ return _iterator.hasNext();
199
+ };
200
+
201
+ this.decompose = function(callback) {
202
+ return _iterator.decompose(callback);
203
+ };
204
+
205
+ this.decomposition = function() {
206
+ return _iterator.decomposition();
207
+ };
208
+
209
+ this.quotients = function() {
210
+ return _iterator.quotients();
211
+ };
212
+
213
+ return this;
214
+ }
215
+ }
216
+ });
217
+ } catch(e) {}
218
+
219
+ })(Math);
@@ -0,0 +1,196 @@
1
+ (function($) {
2
+ "use strict";
3
+
4
+ try {
5
+ Object.defineProperties($.prototype, {
6
+ nextPrimeFactor: {
7
+ value: function() {
8
+ var
9
+ value = this;
10
+
11
+ while(!(++value).isPrime()) {}
12
+
13
+ return value;
14
+ }
15
+ },
16
+
17
+ // Para futuras implementações, como retorno de fatores primos de determinado valor, podemos usar um algorítmo determinístico como os dos dois links abaixo
18
+ // É interessante calcular somente os fatores primos que caberiam para determinado número ao invés de testar com todo número natural até chegar a ele, e salvá-los em i como um array, e no if calcular o retorno 0 somente para estes. Devendo o próprio número ser retornado caso não haja quantidade de múltiplos maior que 1, pois 1 e ele mesmo não deverão entrar no vetor para ser calculado.
19
+
20
+ // http://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes
21
+ // http://pt.wikipedia.org/wiki/Teste_de_primalidade_AKS
22
+
23
+ // dá para usar com gcd
24
+ primeFactors: {
25
+ value: function() {
26
+ var
27
+ factors = [],
28
+ n = parseFloat(this);
29
+
30
+ if(n < 0) {n = Math.abs(n);}
31
+
32
+ while(true) {
33
+ factors.push(n.firstMultiple());
34
+ n = n/n.firstMultiple();
35
+ if(n == 1) {break;}
36
+ }
37
+
38
+ return factors;
39
+ }
40
+ },
41
+
42
+ multipleOf: {
43
+ value: function(numbers) {
44
+ var
45
+ args = Array.from(arguments),
46
+ i = 0,
47
+ n = parseFloat(this),
48
+
49
+ callback = function(item, i) {
50
+ return parseFloat(Math.abs(arguments[i]));
51
+ };
52
+
53
+ args = args.map(callback);
54
+
55
+ if(args.length === 0) {return true;}
56
+
57
+ i = 0;
58
+ while(true) {
59
+ if(args[i] > n || n % args[i] !== 0) {return false;}
60
+ if(i == args.length -1) {break;}
61
+ i++;
62
+ }
63
+
64
+ return true;
65
+ }
66
+ },
67
+
68
+ areMultiples: {
69
+ value: function(numbers) {
70
+ var
71
+ current,
72
+ i = 0,
73
+ args = Array.from(arguments);
74
+
75
+ args.push(this);
76
+ args = args.uniq().desc();
77
+ current = parseFloat(args.shift());
78
+ while(true) {
79
+ while(true) {
80
+ if(!current.multipleOf(args[i++])) {return false;}
81
+ if (i == args.length) {break;}
82
+ }
83
+
84
+ i = 0;
85
+ current = args.delete(i);
86
+ if(!args.length) {break;}
87
+ }
88
+
89
+ return true;
90
+ }
91
+ },
92
+
93
+ isPrime: {
94
+ value: function() {
95
+ var
96
+ amount = 2,
97
+ i = amount,
98
+ n = parseFloat(this);
99
+
100
+ if(n < 0) {n = Math.abs(n);}
101
+ if(n == 1) {return false;}
102
+ if(n < 1 || n == 2) {return true;}
103
+
104
+ while(true) {
105
+ if (i == n || amount > 2) {break;}
106
+ if (n.multipleOf(i)) {amount++;}
107
+ i++;
108
+ }
109
+
110
+ if(amount == 2) {
111
+ return true;
112
+ } else {
113
+ return false;
114
+ }
115
+ }
116
+ },
117
+
118
+ multiples: {
119
+ value: function() {
120
+ var
121
+ n = parseFloat(this),
122
+ i = 1,
123
+ multiples = [];
124
+
125
+ if(n === 0) {return ["∞"];}
126
+ if(n < 0) {n = Math.abs(n);}
127
+ if(n.isPrime()) {return [1, n];}
128
+
129
+ while(true) {
130
+ if(n.multipleOf(i)) {multiples.push(i);}
131
+ if(i == n) {break;}
132
+ i++;
133
+ }
134
+
135
+ return multiples;
136
+ }
137
+ },
138
+
139
+ firstMultiple: {
140
+ value: function() {
141
+ var
142
+ i = 2,
143
+ n = parseFloat(this);
144
+
145
+ if (n < 0) {n = Math.abs(n);}
146
+ if (n <= 1) {return n;}
147
+
148
+ while(true) {
149
+ if(n.multipleOf(i)) {
150
+ return i;
151
+ }
152
+ i++;
153
+
154
+ }
155
+ }
156
+ },
157
+
158
+ fraction: {
159
+ value: function(places) {
160
+ var
161
+ numerator,
162
+ dLength,
163
+ n = parseFloat(this),
164
+ denominator = '1',
165
+ gcd = 1,
166
+ i = 1;
167
+
168
+ if( places && places <= 10 ) {
169
+ n = parseFloat(n.toFixed(places));
170
+ } else if(((n.toString().split('.') )[1]).toString()
171
+ .length > 10) {
172
+ n = parseFloat( n.toFixed(10) );
173
+ }
174
+
175
+ n = n.toString().split('.');
176
+ dLength = n[1].length;
177
+ numerator = parseInt(n[0]+n[1]);
178
+
179
+ while(true) {
180
+ denominator += '0';
181
+ if(i == dLength) {break;}
182
+ i++;
183
+ }
184
+
185
+ denominator = parseInt(denominator);
186
+ gcd = Math.gcd(numerator, denominator);
187
+
188
+ return (numerator/gcd).toString() + '/' + (denominator/gcd)
189
+ .toString();
190
+ }
191
+ }
192
+ });
193
+
194
+ } catch(e) {}
195
+
196
+ })(Number);
@@ -0,0 +1,35 @@
1
+ // // faz o mesmo que _arr = _arr.sort(function(a, b) {return a-b;});
2
+ // // ordena através do método "insertion sort". Se a-b retornar um valor menor que 0 então a é menor que b, se 0 então a é iguala b, se maior que zero, por conseguinte, a é maior que b, e assim ordenará em ordem crescente
3
+ // Array.prototype.insertionSort = function() {
4
+ // var
5
+ // sort = this,
6
+ // aux,
7
+ // i = 0,
8
+ // count = 0
9
+ // ;
10
+
11
+ // while(true) {
12
+ // if(count === sort.length -1) {break;}
13
+ // while(true) {
14
+ // i = count;
15
+ // if( sort[i] > sort[i+1] ) { //0, 1
16
+ // aux = sort[i];
17
+ // sort[i] = sort[i+1];
18
+ // sort[i+1] = aux;
19
+ // while(true) {
20
+ // if(i === 0 || sort[i] > sort[i-1]) {break;}
21
+ // aux = sort[i];
22
+ // sort[i] = sort[i-1];
23
+ // sort[i-1] = aux;
24
+ // i--;
25
+ // }
26
+ // }
27
+ // if(i === 0 || sort[i] < sort[i+1]) {
28
+ // break;
29
+ // }
30
+ // }
31
+ // count++;
32
+ // }
33
+
34
+ // return sort;
35
+ // }
@@ -0,0 +1 @@
1
+ require "mathrix/rails"
@@ -0,0 +1 @@
1
+ require 'mathrix/rails/engine'
@@ -0,0 +1,6 @@
1
+ module Mathrix
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Mathrix
2
+ module Rails
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,19 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ require "mathrix/rails/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mathrix-rails"
7
+ s.version = Mathrix::Rails::VERSION
8
+ s.authors = ["rplaurindo"]
9
+ s.email = ["rafaelplaurindo@gmail.com"]
10
+ s.homepage = "https://rubygems.org/gems/mathrix-rails"
11
+ s.summary = %q{Summary of Mathrix}
12
+ s.description = %q{Complementary mathematical methods.}
13
+ s.license = "MIT"
14
+
15
+ s.files = Dir["{bin,config,lib,vendor}/**/*", "MIT-LICENSE", "Rakefile", "README.md", "mathrix.gemspec"]
16
+
17
+ s.add_dependency 'esphinx-rails', '~> 1'
18
+
19
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mathrix-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - rplaurindo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: esphinx-rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ description: Complementary mathematical methods.
28
+ email:
29
+ - rafaelplaurindo@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - MIT-LICENSE
35
+ - Rakefile
36
+ - lib/assets/javascripts/mathrix/index.js
37
+ - lib/assets/javascripts/mathrix/lib/extensions/array.js
38
+ - lib/assets/javascripts/mathrix/lib/extensions/math.js
39
+ - lib/assets/javascripts/mathrix/lib/extensions/math/prime_factors_decomposition.js
40
+ - lib/assets/javascripts/mathrix/lib/extensions/number.js
41
+ - lib/assets/javascripts/mathrix/samples/array.js
42
+ - lib/mathrix-rails.rb
43
+ - lib/mathrix/rails.rb
44
+ - lib/mathrix/rails/engine.rb
45
+ - lib/mathrix/rails/version.rb
46
+ - mathrix.gemspec
47
+ homepage: https://rubygems.org/gems/mathrix-rails
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.6.14
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Summary of Mathrix
71
+ test_files: []