Hi-QUBO

クイックリファレンス: 式のための演算子と関数

以下の表は、 qbpp::Expr オブジェクトで使用可能な演算子と関数をまとめます。

演算子/関数 演算子記号/関数名 関数の種類 戻り値の型 引数型
型変換 toExpr() グローバル qbpp::Expr ExprType
型変換 toInt() グローバル Int qbpp::Expr
代入 = メンバ qbpp::Expr ExprType
二項演算子 +, -, * グローバル qbpp::Expr ExprType-ExprType
複合代入演算子 +=, -=, *= メンバ qbpp::Expr ExprType
除算 / グローバル qbpp::Expr ExprType-Int
複合除算 /= メンバ qbpp::Expr Int
一項演算子 +, - グローバル qbpp::Expr ExprType
比較(等価) == グローバル qbpp::ExprExpr ExprType-Int
比較(範囲比較) <= <= グローバル qbpp::ExprExpr IntInf-ExprType-IntInf
平方 sqr() グローバル qbpp::Expr ExprType
スクエア sqr() メンバー qbpp::Expr -
GCD gcd() グローバル Int ExprType
簡略化 simplify(), simplify_as_binary(), simplify_as_spin() グローバル qbpp::Expr ExprType
Simplify simplify(), simplify_as_binary(), simplify_as_spin() メンバー qbpp::Expr -
評価 operator() メンバー Int ExprType-qbpp::MapList
置換 replace() グローバル qbpp::Expr ExprType-qbpp::MapList
置換 replace() メンバー qbpp::Expr qbpp::MapList
縮小 reduce() グローバル qbpp::Expr ExprType
減らす reduce() メンバー qbpp::Expr qbpp::MapList
バイナリ/スピン変換 binary_to_spin(), spin_to_binary() グローバル qbpp::Expr ExprType
バイナリ/スピン変換 binary_to_spin(), spin_to_binary() メンバー qbpp::Expr -

型変換:qbpp::toExpr() および qbpp::toInt()

グローバル関数qbpp::toExpr() は引数を qbpp::Expr インスタンスに変換し、それを返します。 引数は以下のいずれかです:

これらの引数型を総称して ExprType.

グローバル関数 は、オブジェクトqbpp::toInt()の整数定数項を抽出して返します qbpp::Expr オブジェクトの整数定数項を抽出して返します。 式に積項(qbpp::Term オブジェクト)が含まれている場合、エラーが発生します。

この用語ExprTypeは、 qbpp::Expr オブジェクトに変換可能な型のカテゴリを表します。

グローバル関数とメンバ関数

演算子および関数 qbpp::Expr は2つの形式で提供される:

例: sqr()

例: sqr() 関数は式の平方を計算し、以下の両方の形式で利用可能です:

代入演算子: =

左辺はオブジェクトでなければなりません qbpp::Expr オブジェクトである必要があります。 右辺は ExprTypeでなければならず、最初に qbpp::Exprに変換される。 変換された式が左辺に代入される。

二項演算子: +, -, *

これらの演算子はグローバル関数として定義されます。 2つの ExprType オペランドを受け取り、結果を計算して返します。 少なくとも一方のオペランドが qbpp::Exprの場合、結果は常に qbpp::Exprとなる。 いずれのオペランドも qbpp::Exprの場合、結果は qbpp::Term.

変数 x の型の場合 qbpp::Var:

複合代入演算子: +=, -=, *=

これらの演算子はメンバ関数として定義されます。 左辺は qbpp::Exprでなければなりません。 指定された演算は右辺のオペランドを用いて適用されます。 左辺の式はその場で更新されます。

除算 / および複合除算 /=

除算演算子 / はグローバル関数として定義されます。

非整数 ExprType を被除として、整数オペランドを除数として取り、商を qbpp::Expr.

被除数は除数で割り切れる必要がある。すなわち、 式中の整数定数項および全ての整数係数が除数で割り切れる必要がある。

複合除算演算子 /= はメンバ関数として定義されます。

同じ除算条件が適用され、除算はその場で実行され、左辺式が更新される。

比較(等価性): ==

等価比較演算子 == は以下を取る:

等価制約が満たされた場合、最小値が 0 となる式を返します。 より具体的には、非整数の場合 ExprType オブジェクト f と整数 nに対して、この演算子は以下を返します: qbpp::sqr(f-n).

返されるオブジェクト g:

qbpp::ExprExpr class

ここで、 g は オブジェクトqbpp::ExprExprであり、これは qbpp::Exprの派生クラスである。 間接参照 g を使用する * 演算子を使用すると、関連付けられた基盤となる qbpp::Expr オブジェクトが返されます。

比較(範囲比較): <= <=

範囲比較演算子は次の形式で記述されます:

l <= f <= u

ここで:

この演算子は、範囲制約が満たされた場合に最小値が 0 となる式を返します。

具体的には、単位間隔を持つ補助整数変数 a が暗黙的に導入され、演算子は以下を返す: [l,u−1]の範囲で値を取る補助整数変数が暗黙的に導入され、演算子は以下を返す:

(f - a)(f - (a + 1))

返される qbpp::ExprExpr オブジェクト g:

平方関数: sqr()

qbpp::Expr オブジェクトに対して f:

最大公約数関数 gcd()

グローバル関数 gcd()qbpp::Expr オブジェクトを引数として受け取り、すべての整数係数と整数の定数項の最大公約数(GCD)を返します。

与えられた qbpp::Expr オブジェクトは結果の最大公約数で割り切れるため、式や最適解の構造を変更することなく、すべての整数係数と整数の定数項を最大公約数で割ることで簡略化できます。

関数の簡略化: simplify(), simplify_as_binary(), simplify_as_spin()

与えられた qbpp::Expr オブジェクト fに対して、メンバ関数 は以下の操作f.simplify()をその場で実行する:

グローバル関数 はqbpp::simplify(f)f.

二項式とスピン簡約化

簡略化関数の2つの特殊な変種が提供される:

両方のバリエーションはメンバ関数およびグローバル関数として利用可能です:

評価関数

A qbpp::MapListオブジェクトは、 qbpp::Var オブジェクトと整数のペアのリストを保持します。 各ペアは変数から整数値へのマッピングを定義します。

オブジェクト qbpp::Expr オブジェクト fqbpp::MapList オブジェクト mlに対して、評価関数

f(ml)

は、変数割り当てによって指定された条件下で f を評価し ml によって指定された変数割り当てのもとで

f に対応するマッピングが ml.

置換関数: replace()

オブジェクトqbpp::MapListは、 qbpp::Var オブジェクトと ExprType オブジェクトからなるペアを含む場合がある。 このようなペアは変数から式へのマッピングを定義する。

特定の qbpp::Expr オブジェクト fqbpp::MapList オブジェクト ml:

Reduce関数: reduce()

reduce()数は、高次項を含むオブジェクトを qbpp::Expr 高次項を含むオブジェクトを、線形項と二次項のみで構成される同等の qbpp::Expr オブジェクトに変換し、線形項と二次項のみで構成される結果を生成します。これによりQUBO式が得られます。

関数 qbpp::Expr オブジェクト f:

二進変換関数: spin_to_binary(), binary_to_spin()

binary_y/spin変換関数:binary_y: x を二進変数、s をスピン変数とする。 以下の条件を仮定する: x = 1 が成立するときのみ s = 1。 この仮定のもとで、以下の関係が成立する:

\[\begin{aligned} s &= 2x-1 \\ x &= (s+1)/2 \end{aligned}\]

$f(s)$ をスピン変数 $s$ の関数とする。 すると、関数 $g(x)=f(2x−1)$ は二値変数 $x$ の関数であり、上記の関係のもとで同じ値を返す。

このspin_to_binary()関数は、この関係を用いて qbpp::Expr 二進変数の関数を表すオブジェクトを、同等の qbpp::Expr 二進変数の関数を表すオブジェクトに変換する。 具体的には、すべてのスピン変数 sf2 * s - 1.

同様に、関数 binary_to_spin()はすべての二進変数を置換します xf(x + 1) / 2に置換します。 結果の式には非整数係数が含まれる可能性があります。 そのため、式全体を $2^d$($d$ は全項の最高次数)で乗算し、全ての係数を整数にします。

グローバル関数およびメンバ関数の両方のバリエーションと同様に spin_to_binary()と同様に、グローバル関数とメンバ関数の両方のバリエーションが binary_to_spin() が提供されています。


最終更新日: 2026.01.02