質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2132閲覧

XOR SWAPの証明方法がわかりません。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/30 06:06

編集2018/11/30 10:54

XOR SWAPの実装

XOR SWAPを知りました。教わったswapは、一時変数を用意して、交換対象の変数の一方を格納するやり方ですが、XOR SWAPは一時変数を使わないやり方だそうです。Scalaで関数を書いて試したところうまく動作しました。

Scala

1def swap(a:Int, b:Int):(Int,Int) = { 2 var l = a; var m = b 3 l = l ^ m 4 m = l ^ m // xor(xor(a,b),b) 復号したa 以下を参照してください。 5 l = l ^ m // xor(xor(a,b),a) 復号したb 6 (l,m) 7}

なぜそうなるのか

ソースコードは3回、XORを取っているだけです。調べてみたところ以下を証明すれば良いことがわかりました。

xor(xor(a,b),b) = a あるいは xor(xor(a,b),a) = b

直感的には、XORを使って暗号化と復号ができるので、次のように解釈しました。
暗号化: xor(a,b) 平文aを鍵bで暗号化する。(平文bを鍵aで暗号化する)
復号: xor(xor(a,b),b) 平文aを鍵bで暗号化した暗号文を鍵bで復号して、元の平文aを得る。

証明

ちゃんとした証明がわかりません。よろしくお願いします。

真理値表

お二人の回答で教わったとおり、真理値表を作りました。

abxor(a,b)xor(xor(a,b),b)xor(xor(a,b),a)
00000
01101
10110
11011

確かに、「xor(xor(a,b),b) = a あるいは xor(xor(a,b),a) = b」になりました。
これは証明なのですね。私は代数的な証明を考えていました。代数的な証明はできますか。

交換律

教えていただいた3つの規則に交換律を足して4つにします。
xor(a,b) = xor(b,a)

xor(xor(a,b),a) = bの証明は以下のとおり。

xor(xor(a,b),a)
= xor(xor(b,a),a) 交換律
以下省略

蛇足ですが、xor(1,a) = not(a) なのがわかりました。自力で考えられたので嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

どこまで前提としていいのかわかりませんが、

(a^b)^b
= a^(b^b)
= a ^ 0
= a

投稿2018/11/30 07:03

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/30 07:08

ありがとうございます。すでにベストアンサーを選んでしまいましたが、私の望んだ回答です。
guest

0

XORの真理値表は4通りしかありません。ビットが増えても、これをただ並べただけになります。

|A|B|A^B|
|:==:|:==:|:==:|
|0|0|0|
|0|1|1|
|1|0|1|
|1|1|0|

あとは、4通りどれでも成立するか確認するだけです。「ちゃんとした証明」がどのようなものを言うのかわかりませんが、「全部調べる」のも立派な方法の1つです。

投稿2018/11/30 06:18

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/30 07:06

ありがとうございます。真理値表を書くやり方を知りました。
guest

0

ベストアンサー

こんな真理値表を埋めれば良いんじゃないでしょうか。

aba XOR b(a XOR b) XOR b(a XOR b) XOR a)
00.........
01.........
10.........
11.........

別解

ブール演算でやるならこんな感じです。

(a XOR b) XOR b = a XOR (b XOR b) # 結合律 = a XOR 0 # (b XOR b)は0 = a # a XOR 0はa

投稿2018/11/30 06:17

編集2018/11/30 06:45
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/30 07:05

ありがとうございます。ブール演算で3つの規則を使っていることがわかりました。結合律と(a xor a) = 0と(a xor 0) = aですね。それぞれの証明を考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問