Greedy algorithm for Egyptian fractions: Difference between revisions
Content added Content deleted
m (Phix/mpfr) |
m (Reformatted to reduce line count) |
||
Line 335: | Line 335: | ||
typedef boost::multiprecision::cpp_int integer; |
typedef boost::multiprecision::cpp_int integer; |
||
integer mod(const integer& x, const integer& y) |
integer mod(const integer& x, const integer& y) { |
||
{ |
|||
return ((x % y) + y) % y; |
return ((x % y) + y) % y; |
||
} |
} |
||
size_t count_digits(const integer& i) |
size_t count_digits(const integer& i) { |
||
{ |
|||
std::ostringstream os; |
std::ostringstream os; |
||
os << i; |
os << i; |
||
Line 347: | Line 345: | ||
} |
} |
||
std::string integer_to_string(const integer& i) |
std::string integer_to_string(const integer& i) { |
||
{ |
|||
const int max_digits = 20; |
const int max_digits = 20; |
||
std::ostringstream os; |
std::ostringstream os; |
||
os << i; |
os << i; |
||
std::string s = os.str(); |
std::string s = os.str(); |
||
if (s.length() > max_digits) |
if (s.length() > max_digits) { |
||
{ |
|||
s = s.substr(0, max_digits/2) + "..." + s.substr(s.length()-max_digits/2); |
s = s.substr(0, max_digits/2) + "..." + s.substr(s.length()-max_digits/2); |
||
} |
} |
||
Line 360: | Line 356: | ||
} |
} |
||
void egyptian(integer x, integer y, std::vector<integer>& result) |
void egyptian(integer x, integer y, std::vector<integer>& result) { |
||
{ |
|||
result.clear(); |
result.clear(); |
||
while (x > 0) |
while (x > 0) { |
||
{ |
|||
integer z = (y + x - 1)/x; |
integer z = (y + x - 1)/x; |
||
result.push_back(z); |
result.push_back(z); |
||
Line 372: | Line 366: | ||
} |
} |
||
void print_egyptian(const std::vector<integer>& result) |
void print_egyptian(const std::vector<integer>& result) { |
||
{ |
|||
if (result.empty()) |
if (result.empty()) |
||
return; |
return; |
||
Line 383: | Line 376: | ||
} |
} |
||
void print_egyptian(integer x, integer y) |
void print_egyptian(integer x, integer y) { |
||
{ |
|||
std::cout << "Egyptian fraction for " << x << "/" << y << ": "; |
std::cout << "Egyptian fraction for " << x << "/" << y << ": "; |
||
if (x > y) |
if (x > y) { |
||
{ |
|||
std::cout << "[" << x/y << "] "; |
std::cout << "[" << x/y << "] "; |
||
x = x % y; |
x = x % y; |
||
Line 396: | Line 387: | ||
} |
} |
||
void show_max_terms_and_max_denominator(const integer& limit) |
void show_max_terms_and_max_denominator(const integer& limit) { |
||
{ |
|||
size_t max_terms = 0; |
size_t max_terms = 0; |
||
integer max_terms_numerator, max_terms_denominator; |
integer max_terms_numerator, max_terms_denominator; |
||
Line 405: | Line 395: | ||
std::vector<integer> max_denominator_result; |
std::vector<integer> max_denominator_result; |
||
std::vector<integer> result; |
std::vector<integer> result; |
||
for (integer b = 2; b < limit; ++b) |
for (integer b = 2; b < limit; ++b) { |
||
⚫ | |||
{ |
|||
⚫ | |||
{ |
|||
egyptian(a, b, result); |
egyptian(a, b, result); |
||
if (result.size() > max_terms) |
if (result.size() > max_terms) { |
||
{ |
|||
max_terms = result.size(); |
max_terms = result.size(); |
||
max_terms_result = result; |
max_terms_result = result; |
||
Line 418: | Line 405: | ||
} |
} |
||
integer largest_denominator = result.back(); |
integer largest_denominator = result.back(); |
||
if (largest_denominator > max_denominator) |
if (largest_denominator > max_denominator) { |
||
{ |
|||
max_denominator = largest_denominator; |
max_denominator = largest_denominator; |
||
max_denominator_result = result; |
max_denominator_result = result; |
||
Line 436: | Line 422: | ||
} |
} |
||
int main() |
int main() { |
||
{ |
|||
print_egyptian(43, 48); |
print_egyptian(43, 48); |
||
print_egyptian(5, 121); |
print_egyptian(5, 121); |