Skip to content

Commit a0eb41d

Browse files
authored
Add simple math algorithms (TheAlgorithms#251)
1 parent 5e4b314 commit a0eb41d

File tree

7 files changed

+182
-2
lines changed

7 files changed

+182
-2
lines changed

CONTRIBUTING.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ mod tests {
4343

4444
Do **not** use acronyms: `DFS` should be `depth_first_search`.
4545

46-
Make sure you ran
46+
Make sure you run
4747
* `cargo test`
4848
* `cargo fmt`
49-
49+
* `cargo clippy`
50+
5051
And that's about it !

DIRECTORY.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
* Math
5252
* [Extended Euclidean Algorithm](https://github.com/TheAlgorithms/Rust/blob/master/src/math/extended_euclidean_algorithm.rs)
5353
* [Pascal Triangle](https://github.com/TheAlgorithms/Rust/blob/master/src/math/pascal_triangle.rs)
54+
* [Perfect Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/perfect_numbers.rs)
55+
* [Prime Check](https://github.com/TheAlgorithms/Rust/blob/master/src/math/prime_check.rs)
56+
* [Prime Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/prime_numbers.rs)
57+
* [Trial Division](https://github.com/TheAlgorithms/Rust/blob/master/src/math/trial_division.rs)
5458
* Searching
5559
* [Binary Search](https://github.com/TheAlgorithms/Rust/blob/master/src/searching/binary_search.rs)
5660
* [Binary Search Recursive](https://github.com/TheAlgorithms/Rust/blob/master/src/searching/binary_search_recursive.rs)

src/math/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
mod extended_euclidean_algorithm;
22
mod pascal_triangle;
3+
mod perfect_numbers;
4+
mod prime_check;
5+
mod prime_numbers;
6+
mod trial_division;
37

48
pub use self::extended_euclidean_algorithm::extended_euclidean_algorithm;
59
pub use self::pascal_triangle::pascal_triangle;
10+
pub use self::perfect_numbers::perfect_numbers;
11+
pub use self::prime_check::prime_check;
12+
pub use self::prime_numbers::prime_numbers;
13+
pub use self::trial_division::trial_division;

src/math/perfect_numbers.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
pub fn is_perfect_number(num: usize) -> bool {
2+
let mut sum = 0;
3+
4+
for i in 1..num - 1 {
5+
if num % i == 0 {
6+
sum += i;
7+
}
8+
}
9+
10+
num == sum
11+
}
12+
13+
pub fn perfect_numbers(max: usize) -> Vec<usize> {
14+
let mut result: Vec<usize> = Vec::new();
15+
16+
// It is not known if there are any odd perfect numbers, so we go around all the numbers.
17+
for i in 1..max + 1 {
18+
if is_perfect_number(i) {
19+
result.push(i);
20+
}
21+
}
22+
23+
result
24+
}
25+
26+
#[cfg(test)]
27+
mod tests {
28+
use super::*;
29+
30+
#[test]
31+
fn basic() {
32+
assert_eq!(is_perfect_number(6), true);
33+
assert_eq!(is_perfect_number(28), true);
34+
assert_eq!(is_perfect_number(496), true);
35+
assert_eq!(is_perfect_number(8128), true);
36+
37+
assert_eq!(is_perfect_number(5), false);
38+
assert_eq!(is_perfect_number(86), false);
39+
assert_eq!(is_perfect_number(497), false);
40+
assert_eq!(is_perfect_number(8120), false);
41+
42+
assert_eq!(perfect_numbers(10), vec![6]);
43+
assert_eq!(perfect_numbers(100), vec![6, 28]);
44+
assert_eq!(perfect_numbers(496), vec![6, 28, 496]);
45+
assert_eq!(perfect_numbers(1000), vec![6, 28, 496]);
46+
}
47+
}

src/math/prime_check.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
pub fn prime_check(num: usize) -> bool {
2+
if (num > 1) & (num < 4) {
3+
return true;
4+
} else if (num < 2) || (num % 2 == 0) {
5+
return false;
6+
}
7+
8+
let stop: usize = (num as f64).sqrt() as usize + 1;
9+
for i in (3..stop).step_by(2) {
10+
if num % i == 0 {
11+
return false;
12+
}
13+
}
14+
true
15+
}
16+
17+
#[cfg(test)]
18+
mod tests {
19+
use super::*;
20+
21+
#[test]
22+
fn basic() {
23+
assert_eq!(prime_check(3), true);
24+
assert_eq!(prime_check(7), true);
25+
assert_eq!(prime_check(11), true);
26+
assert_eq!(prime_check(2003), true);
27+
28+
assert_eq!(prime_check(4), false);
29+
assert_eq!(prime_check(6), false);
30+
assert_eq!(prime_check(21), false);
31+
assert_eq!(prime_check(2004), false);
32+
}
33+
}

src/math/prime_numbers.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
pub fn prime_numbers(max: usize) -> Vec<usize> {
2+
let mut result: Vec<usize> = Vec::new();
3+
4+
if max >= 2 {
5+
result.push(2)
6+
}
7+
for i in (3..max + 1).step_by(2) {
8+
let stop: usize = (i as f64).sqrt() as usize + 1;
9+
let mut status: bool = true;
10+
11+
for j in (3..stop).step_by(2) {
12+
if i % j == 0 {
13+
status = false
14+
}
15+
}
16+
if status {
17+
result.push(i)
18+
}
19+
}
20+
21+
result
22+
}
23+
24+
#[cfg(test)]
25+
mod tests {
26+
use super::*;
27+
28+
#[test]
29+
fn basic() {
30+
assert_eq!(prime_numbers(0), vec![]);
31+
assert_eq!(prime_numbers(11), vec![2, 3, 5, 7, 11]);
32+
assert_eq!(prime_numbers(25), vec![2, 3, 5, 7, 11, 13, 17, 19, 23]);
33+
assert_eq!(
34+
prime_numbers(33),
35+
vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
36+
);
37+
}
38+
}

src/math/trial_division.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
fn floor(value: f64, scale: u8) -> f64 {
2+
let multiplier = 10i64.pow(scale as u32) as f64;
3+
(value * multiplier).floor()
4+
}
5+
6+
fn double_to_int(amount: f64) -> i128 {
7+
amount.round() as i128
8+
}
9+
10+
pub fn trial_division(mut num: i128) -> Vec<i128> {
11+
let mut result: Vec<i128> = vec![];
12+
13+
while num % 2 == 0 {
14+
result.push(2);
15+
num /= 2;
16+
num = double_to_int(floor(num as f64, 0))
17+
}
18+
let mut f: i128 = 3;
19+
20+
while f.pow(2) <= num {
21+
if num % f == 0 {
22+
result.push(f);
23+
num /= f;
24+
num = double_to_int(floor(num as f64, 0))
25+
} else {
26+
f += 2
27+
}
28+
}
29+
30+
if num != 1 {
31+
result.push(num)
32+
}
33+
result
34+
}
35+
36+
#[cfg(test)]
37+
mod tests {
38+
use super::*;
39+
40+
#[test]
41+
fn basic() {
42+
assert_eq!(trial_division(9), vec!(3, 3));
43+
assert_eq!(trial_division(10), vec!(2, 5));
44+
assert_eq!(trial_division(11), vec!(11));
45+
assert_eq!(trial_division(33), vec!(3, 11));
46+
assert_eq!(trial_division(2003), vec!(2003));
47+
assert_eq!(trial_division(100001), vec!(11, 9091));
48+
}
49+
}

0 commit comments

Comments
 (0)