t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
OR、AND、XORなどの8入力真理値表を使用して上記の8x8の対称性を判断することは可能ですか?
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
OR、AND、XORなどの8入力真理値表を使用して上記の8x8の対称性を判断することは可能ですか?
したがって、コメントで私が言ったことは、特定のペアを繰り返しチェックし、それらに対して「NOTXOR」を実行することです。
ペアの考え方は、行が対称である場合、等しくなければならない特定のペアがあるということです。インデックス配列がゼロであることに注意してください。各行内で、ペアのインデックスは0と7、1と6、2と5、および3と4になります。行を対称にするには、4つすべてが一致するペア。全体として、テーブルを対称にするために、チェックするペアが32あります(各行に4ペア、8行以上)。
NOT XORの秘訣は、2つが異なる場合にXORがtrueを返すため、2つが同じである場合にそのステートメントの否定がtrueを返すことです。
したがって、ブール演算のみを使用してこのチェック全体を実行する場合は、これらのペアのそれぞれを取得し(今のところ(a、b)と呼びます)、(NOT(a XOR b))(!(a^b)
コード内)を実行します。次に、これらの32個すべてのチェックの結果をANDします。
確かに、私が実際にこれをコードで行っているのであれば、私はむしろ定期的に同等性をチェックしたいと思います。
bool[][]
私と同じように対称性を意味し、aまたはanのような入力があると仮定するとstd::vector<std::vector<bool> >
(または、char
の代わりにbool
、動作する限り、それは実際には重要ではありません==
)、マトリックスの半分を反復するだけです。残りの半分と比較すると、次のようになります。
bool symmetric = true;
for (unsigned int i = 1; symmetric && i <= n; ++i) {
for (unsigned int j = i+1; symmetric && j <= n; ++j) {
symmetric = (M[i][j] == M[j][i]);
}
}
対角線をチェックする必要がないことに注意してください。そのため、上記のコードでi
は1から始まります。j
i+1
(私は一部の人が好むよりも多くの括弧と中括弧を書く傾向があります。私はたまたまそのように書かれたコードを好むだけです。)
編集:
確かに、どの入力が対称であるかを示す64入力テーブルを持つことができます。少し圧縮すると、そのテーブルを2097152TBのメモリに格納できます。ルックアップのためにこのテーブルのロードが完了する前に、ループコードがかなり頻繁に実行される可能性があると思います。代わりに、もちろん、反対角に平行な6つの自明でない線を、対応する真理値表に入力することもできます。これらが対称である場合、行列全体が対称であるためです。これらのテーブル(2、3、4、5、6、7、および8入力用)は、数百バイトに簡単に収まります。
しかし、とにかく、あなたの対称性の解釈は私のものとは異なっているようです。各行や各列が対称であるかどうかに関心がある場合は、明らかに、そのために真理値表を使用できます。それらをストローするには256ビットが必要なので、スペースが本当に不足している場合は、それらを8ビットに絞ることができますが、256バイトを使用すると、ルックアップがおそらく高速になります。