Ilya_Bykonya

Minimum sum of squares decomposition

Oct 16th, 2024 (edited)
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.43 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <generator>
  3. #include <iterator>
  4. #include <iostream>
  5. #include <numeric>
  6. #include <ranges>
  7. #include <vector>
  8. #include <print>
  9. #include <cmath>
  10.  
  11. namespace std {
  12. template<typename T>
  13. std::ostream& operator<<(std::ostream& out, const std::vector<T>& elements) {
  14.     out << '[';
  15.     std::ranges::copy(elements, std::ostream_iterator<T>{ out, " " });
  16.     out << ']';
  17.     return out;
  18. }
  19. }
  20.  
  21. int32_t int32_t_sqrt(int32_t number) {
  22.     const auto result = static_cast<int32_t>(sqrt(number));
  23.     if((result + 1) * (result + 1) <= number) {
  24.         return result + 1;
  25.     } else {
  26.         return result;
  27.     }
  28. }
  29. std::generator<size_t> elements(const int32_t number, std::reference_wrapper<size_t> current_min_result, size_t current_result, size_t offset = 0) {
  30.     for(int32_t element = int32_t_sqrt(number); element > 0; --element) {
  31.         std::println("{0}[{1}][{2} > {3}]", std::string(offset, '\t'), offset, number, element);
  32.         if(const auto remainder = number - element * element; remainder == 0) {
  33.             if(current_min_result > current_result) {
  34.                 current_min_result = current_result;
  35.             }
  36.             co_yield current_result;
  37.         } else if(current_result >= current_min_result) {
  38.             co_return;
  39.         } else {
  40.             for(const auto& subresult: elements(remainder, current_min_result, current_result + 1, offset + 1)) {
  41.                 if(current_min_result > subresult) {
  42.                     current_min_result = subresult;
  43.                 }
  44.                 co_yield subresult;
  45.             }
  46.         }
  47.     }
  48. }
  49. size_t find_minimal_result(int32_t number) {
  50.     if(number == 0) { return 1; }
  51.     size_t current_min_result{ std::numeric_limits<size_t>::max() };
  52.     return std::ranges::min(elements(number, std::ref(current_min_result), 1, 0));
  53. }
  54.  
  55. int main() {
  56.     std::println("Result: {0}", find_minimal_result(21));
  57. }
  58.  
  59.  
  60.  
  61. /*
  62.  // Simplify
  63.  
  64. int32_t int32_t_sqrt(int32_t number) {
  65.     const auto result = static_cast<int32_t>(sqrt(number));
  66.     if((result + 1) * (result + 1) <= number) {
  67.         return result + 1;
  68.     } else {
  69.         return result;
  70.     }
  71. }
  72. size_t elements(const int32_t number, size_t& current_min_result, size_t current_result, size_t offset = 0) {
  73.     size_t result{ std::numeric_limits<size_t>::max() };
  74.     for(int32_t element = int32_t_sqrt(number); element > 0; --element) {
  75.         std::println("{0}[{1}][{2} > {3}][{4}/{5}]", std::string(offset, '\t'), offset, number, element, current_result, current_min_result);
  76.         if(const auto remainder = number - element * element; remainder == 0) {
  77.             if(current_min_result > current_result) {
  78.                 current_min_result = current_result;
  79.             }
  80.             return current_result;
  81.         } else if(current_result >= current_min_result) {
  82.             return std::numeric_limits<size_t>::max();
  83.         } else {
  84.             const auto subresult = elements(remainder, current_min_result, current_result + 1, offset + 1);
  85.             if(result > subresult) {
  86.                 result = subresult;
  87.             }
  88.         }
  89.     }
  90.     return result;
  91. }
  92. size_t find_minimal_result(int32_t number) {
  93.     if(number == 0) { return 1; }
  94.     size_t current_min_result{ std::numeric_limits<size_t>::max() };
  95.     return elements(number, std::ref(current_min_result), 1, 0);
  96. }
  97.  
  98. int main() {
  99.     std::println("Result: {0}", find_minimal_result(21));
  100. }
  101.  
  102. */
  103.  
Tags: C++ leetcode
Advertisement
Add Comment
Please, Sign In to add comment