mathrix-rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +24 -0
- data/lib/assets/javascripts/mathrix/index.js +3 -0
- data/lib/assets/javascripts/mathrix/lib/extensions/array.js +33 -0
- data/lib/assets/javascripts/mathrix/lib/extensions/math.js +140 -0
- data/lib/assets/javascripts/mathrix/lib/extensions/math/prime_factors_decomposition.js +219 -0
- data/lib/assets/javascripts/mathrix/lib/extensions/number.js +196 -0
- data/lib/assets/javascripts/mathrix/samples/array.js +35 -0
- data/lib/mathrix-rails.rb +1 -0
- data/lib/mathrix/rails.rb +1 -0
- data/lib/mathrix/rails/engine.rb +6 -0
- data/lib/mathrix/rails/version.rb +5 -0
- data/mathrix.gemspec +19 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -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
|
data/MIT-LICENSE
ADDED
@@ -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.
|
data/Rakefile
ADDED
@@ -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,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'
|
data/mathrix.gemspec
ADDED
@@ -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: []
|