Hi-QUBO

ピタゴラス数

3つの整数 $x$, $y$, $z$ は、次の式を満たすとき、ピタゴラス三重項である

\[\begin{aligned} x^2+y^2&=z^2 \end{aligned}\]

重複を避けるため、$x<y$ と仮定する。

ピタゴラス三つ組を列挙するQUBO++プログラム

以下のプログラムは $x\leq 16$、$y\leq 16$、$z\leq 16$ を満たすピタゴラス三重項を列挙する:

#include "qbpp.hpp"
#include "qbpp_easy_solver.hpp"

int main() {
  auto x = 1 <= qbpp::var_int("x") <= 16;
  auto y = 1 <= qbpp::var_int("y") <= 16;
  auto z = 1 <= qbpp::var_int("z") <= 16;
  auto f = x * x + y * y - z * z == 0;
  auto c = 1 <= y - x <= +qbpp::inf;
  auto g = f + c;
  g.simplify_as_binary();
  auto solver = qbpp::easy_solver::EasySolver(g);
  solver.time_limit(10.0);
  solver.enable_best_energy_sols(10);
  auto sols = solver.search();
  for (const auto& sol : sols) {
    std::cout << "x=" << sol(x) << ", y=" << sol(y) << ", z=" << sol(z)
              << ", *f=" << sol(*f) << ", *c=" << sol(*c) << std::endl;
  }
}

このプログラムでは、整数変数 x, y, および z の範囲を1から16とする。 次に、次の2つの制約式を作成する:

これらは結合され g。 この式は g は、すべての制約が満たされたときに最小値 0 を達成する。

簡単なソルバーオブジェクト solver が作成され g 以下のオプションで設定される:

呼び出し search()qbpp::easy_solver::Sols オブジェクト solsという名前の オブジェクトを返し、最良の解を格納します。 は qbpp::easy_solver::Sols は保存された最良エネルギー解へのイテレータアクセスを提供します(begin(), end(), cbegin(), and cend())へのイテレータアクセスを提供するため、範囲ベースのforループを使用して出力できます。

このプログラムは以下の出力を生成します:

x=3, y=4, z=5, *f=0, *c=1
x=6, y=8, z=10, *f=0, *c=2
x=9, y=12, z=15, *f=0, *c=3
x=5, y=12, z=13, *f=0, *c=7

最終更新日: 2026.01.03