# 剰余問題 :::{container} prog-cpp 以下の問題はHi-QUBOを用いて解くことができます. 次の条件を満たす最小の非負整数 $x$ を求めます: - $x$ を3で割った余りが2 - $x$ を5で割った余りが3 - $x$ を7で割った余りが5 3,5,7は互いに素であるため,1周期内で $x$ を探索すれば十分です: $$ 0\leq x \leq 3\times 5\times 7 -1 $$ 非負整数 $d_3$,$d_5$,$d_7$(商)を導入し,剰余条件を線形等式として書き直します: $$ \begin{aligned} x - 3d_3 &= 2 \\ x - 5d_5 &=3 \\ x - 7d_7 &= 5 \end{aligned} $$ これらの制約の下で $x$ を最小化したいです. 上記の $x$ の範囲から,商の変数は以下のように制限できます: $$ \begin{aligned} 0&\leq d_3 \leq 5\times 7-1 \\ 0&\leq d_5 \leq 3\times 7-1 \\ 0&\leq d_7 \leq 3\times 5-1 \end{aligned} $$ ## Hi-QUBO プログラム 以下のプログラムは,この剰余問題の解 $x$ を求めます: ```{literalinclude} /../programFiles/cppPrograms/example/math/modular-arithmetic-program1.cpp :language: cpp :caption: modular-arithmetic-program1.cpp ``` 3つの制約は `c3`,`c5`,`c7` として表現されています. それぞれは,対応する等式が成り立つときに0になるQUBOペナルティ項に変換されます. 次に,制約の充足を $x$ の削減よりも優先するために,大きなペナルティ重み(1000)を用いて `x` を最小化します. 最後に,Easy Solverが制限時間(1.0秒)内で f の低エネルギー解を探索し,得られた値は以下のように出力されます: ```{include} /../programFiles/markDown/example/math/modular-arithmetic.md :start-after: :end-before: ``` したがって, $$ \begin{aligned} x &\equiv 68 & (\bmod 105) \end{aligned} $$ 最小の解は $x=68$ です. ::: :::{container} prog-python 以下の問題は PyQBPP を使って解くことができます. 次の条件を満たす最小の非負整数 $x$ を求めます: - $x$ を 3 で割った余りが 2, - $x$ を 5 で割った余りが 3, - $x$ を 7 で割った余りが 5. 3,5,7 は互いに素であるため,1周期内で $x$ を探索すれば十分です: $$ 0\leq x \leq 3\times 5\times 7 -1 $$ 非負整数 $d_3$,$d_5$,$d_7$(商)を導入し,余りの条件を線形等式として書き直します: $$ \begin{aligned} x - 3d_3 &= 2 \\ x - 5d_5 &=3 \\ x - 7d_7 &= 5 \end{aligned} $$ これらの制約の下で $x$ を最小化したいです. 上記の $x$ の範囲から,商の変数を以下のように制限できます: $$ \begin{aligned} 0&\leq d_3 \leq 5\times 7-1 \\ 0&\leq d_5 \leq 3\times 7-1 \\ 0&\leq d_7 \leq 3\times 5-1 \end{aligned} $$ ## PyQBPP プログラム 以下のプログラムは,この余り問題の解 $x$ を求めます: ```{literalinclude} /../programFiles/pythonPrograms/example/math/modular-arithmetic-program1.py :language: python :caption: modular-arithmetic-program1.py ``` 3つの制約は `c3`,`c5`,`c7` として表現されています. それぞれは,対応する等式が成り立つときに 0 となる QUBO ペナルティ項に変換されます. 大きなペナルティ重み(1000)を使って `x` を最小化することで,`x` の削減よりも制約の充足が優先されます. 最後に,Easy Solver がキーワード引数で指定された制限時間(1.0秒)内で f の低エネルギー解を探索し,得られた値は以下のように出力されます: ```{include} /../programFiles/markDown/example/math/modular-arithmetic.md :start-after: :end-before: ``` したがって, $$ \begin{aligned} x &\equiv 68 & (\bmod 105) \end{aligned} $$ 最小の解は $x=68$ です. :::