3桁の数学問題

以下の数学問題をHi-QUBOを使って解きましょう.

数学問題: 各桁の積が 252 となる3桁の奇数をすべて求めよ.

\(x\),\(y\),\(z\) をそれぞれ百の位,十の位,一の位の数字とします. より具体的には:

  • \(x\) は \([1, 9]\) の整数,

  • \(y\) は \([0, 9]\) の整数,

  • \(t\) は \([0, 4]\) の整数,

  • \(z = 2t + 1\)(\(z\) は奇数).

3桁の整数 \(xyz\) の値 \(v\) は

\[ \begin{aligned} v&=100x+10y+z \end{aligned} \]

次の条件を満たすすべての解を求めます:

\[ \begin{aligned} xyz &= 252 \end{aligned} \]

Hi-QUBOプログラム

以下のHi-QUBOプログラムはすべての解を求めます:

three-digit-program1.cpp
#include <set>

#include <qbpp/qbpp.hpp>
#include <qbpp/exhaustive_solver.hpp>

int main() {
  auto x = 1 <= qbpp::var_int("x") <= 9;
  auto y = 0 <= qbpp::var_int("y") <= 9;
  auto t = 0 <= qbpp::var_int("t") <= 4;
  auto z = 2 * t + 1;
  auto v = x * 100 + y * 10 + z;

  auto f = x * y * z == 252;

  f.simplify_as_binary();
  auto solver = qbpp::ExhaustiveSolver(f);
  auto sols = solver.search({{"best_energy_sols", 0}});
  std::set<int> s;
  for (const auto& sol : sols) {
    s.insert(static_cast<int>(sol(v)));
  }
  for (auto v : s) {
    std::cout << v << " ";
  }
  std::cout << std::endl;
}

このプログラムでは,x,y,t が上記の範囲を持つ整数変数として定義されています. 次に z,v,f が式として定義されます. f に対するExhaustive Solverインスタンスを作成し,すべての最適解を sols に格納します.

x,y,t は複数のバイナリ変数で符号化されるため,異なるバイナリ割り当てが同じ整数値を表す場合があります. その結果,同じ桁の組 (x,y,z) が sols に複数回現れることがあります. そのため,結果の整数値 v のみを収集する std::set<int> 型の s を使用して重複を除去しています.

s 内の整数は以下のように出力されます:

479 497 667 749 947

以下の数学問題をPyQBPPを用いて解きます.

数学問題: 各桁の積が252である3桁の奇数をすべて求めてください.

\(x\),\(y\),\(z\) をそれぞれ百の位,十の位,一の位の数字とします. より具体的には:

  • \(x\) は \([1, 9]\) の整数,

  • \(y\) は \([0, 9]\) の整数,

  • \(t\) は \([0, 4]\) の整数,

  • \(z = 2t + 1\)(\(z\) は奇数).

3桁の整数 \(xyz\) の値 \(v\) は

\[ \begin{aligned} v&=100x+10y+z \end{aligned} \]

以下を満たすすべての解を求めます:

\[ \begin{aligned} xyz &= 252 \end{aligned} \]

PyQBPPプログラム

以下のPyQBPPプログラムですべての解を求めます:

three-digit-program1.py
import pyqbpp as qbpp

x = qbpp.var("x", between=(1, 9))
y = qbpp.var("y", between=(0, 9))
t = qbpp.var("t", between=(0, 4))
z = 2 * t + 1
v = x * 100 + y * 10 + z

f = (x * y * z == 252)

f.simplify_as_binary()
solver = qbpp.ExhaustiveSolver(f)
result = solver.search(best_energy_sols=0)
s = set()
for sol in result.sols:
    s.add(sol(v))
for val in sorted(s):
    print(val, end=" ")
print()

このプログラムでは,x,y,t を上記の範囲の整数変数として定義します. 次に z,v,f を式として定義します. f に対するExhaustive Solverインスタンスを作成し,すべての最適解を result.sols に格納します.

x,y,t は複数のバイナリ変数でエンコードされるため,異なるバイナリ割り当てが同じ整数値を表す場合があります. その結果,同じ数字の組 (x,y,z) が result.sols に複数回現れる可能性があります. そのため,結果の整数値 v のみを収集する Python 組み込みの set 型 s を使って重複を除去しています.

s 内の整数は以下のように出力されます:

479 497 667 749 947