Skip to content

Commit 33f33a9

Browse files
committed
Add root simplification
1 parent d72a29f commit 33f33a9

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
Root Simplification
3+
Archive of Reversing.ID
4+
Algorithm (Mathematics/Numbers)
5+
6+
Compile:
7+
[clang]
8+
$ clang++ root-simplification.cpp -o root-simplification
9+
10+
[gcc]
11+
$ g++ root-simplification.cpp -o root-simplification
12+
13+
[msvc]
14+
$ cl root-simplification.cpp
15+
16+
Run:
17+
$ root-simplification
18+
*/
19+
#include <tuple>
20+
#include <cmath>
21+
22+
/*
23+
Menyederhanakan bilangan akar √X Menjadi bentuk perfect dan radicand C√D
24+
25+
√A = B√C
26+
A = num
27+
B = perfect number
28+
C = radicand
29+
30+
Contoh:
31+
√20 = 2√5
32+
√56 = 3√7
33+
34+
berlaku juga untuk akar lain (akar pangkat 3, akar pangkat 4, dsb).
35+
*/
36+
37+
// ======================================================================================
38+
39+
/*
40+
Iterative Solution
41+
Melakukan faktorisasi, mencari faktor-faktor prima dari bilangan dan membangun
42+
perfect number dan radicand di setiap iterasi.
43+
*/
44+
45+
auto algorithm(size_t num, size_t degree)
46+
{
47+
size_t power = 0;
48+
size_t number = 2;
49+
50+
size_t perfect = 1, radicand = 1;
51+
52+
// proses faktor 2 sebagai satu-satunya faktor prima genap.
53+
power = 0;
54+
while (num % 2 == 0)
55+
{
56+
num = num / 2;
57+
58+
power ++;
59+
if (power == degree)
60+
{
61+
power = 0;
62+
perfect *= 2;
63+
}
64+
}
65+
66+
for (size_t j = 0; j < power; j++)
67+
radicand *= 2;
68+
69+
// proses faktor prima dimulai dari 3
70+
for (size_t i = 3, batas = sqrt(num); i <= batas; i += 2)
71+
{
72+
power = 0;
73+
74+
// mendapatkan bernilai sama
75+
while (num % i == 0)
76+
{
77+
num = num / i;
78+
79+
power++;
80+
if (power == degree)
81+
{
82+
power = 0;
83+
perfect *= i;
84+
}
85+
}
86+
87+
for (size_t j = 0; j < power; j++)
88+
radicand *= i;
89+
}
90+
91+
// jika ada faktor yang lebih besar daripada sqrt(num)
92+
if (num > 2)
93+
radicand *= num;
94+
95+
// get<0> -> perfect, get<0> -> radicand
96+
return std::make_tuple(perfect, radicand);
97+
}

0 commit comments

Comments
 (0)