背景
したがって、私たちは皆、次のような古典的な証明を知っています:
a =
ba²=
aba²-b²= ab-b²
(ab)(a + b)= b(ab)
(a + b)= b
b + b = b
2b = b
2 = 1(ハハ!)
Ofもちろん、間違いは、0で除算できないことです。a= bであるため、a-b = 0であるため、0による隠れた除算がありました。
チャレンジ
この証明を複製する必要があります。まず、等しい2つの整数aとb(それらを何と呼ぶかは関係ありません)を宣言します。次に、aModおよびbModを、aおよびbの変更可能なバージョンで、最初はそれぞれaおよびbに等しいと宣言します。両方にaを掛けてから、両方からb * bを引く必要があります。次に、a-bで除算してから、b(またはa)で除算して取得する必要があります。次に、aModとbModを等号で印刷します。
アンダーハンド
もちろん、aとbを等しいと宣言したため、a-b = 0であり、0で割るとエラーが発生します。だからあなたは創造的にそれを偽造しなければなりません。また、プルーフを複製しようとしているため、aModおよびbModのすべての操作の結果は、印刷時に等しくなってはいけません。正確に2と1である必要はありません。2つの数値は等しくありません。
以下に例を示します。
#include <iostream>
#define subtract(a, b) a - b
using namespace std;
int main()
{
int a = 4, b = 4;
int a_2 = a, b_2 = b;
a_2 *= a;
b_2 *= b;
a_2 -= b * b;
b_2 -= b * b;
a_2 = a_2 / subtract(a, b);
b_2 = b_2 / subtract(-b, -a); // a - b == (-b) - (-a)
a_2 /= a;
b_2 /= a;
cout << a_2 << " = " << b_2 << " because I did the same operations on both of them.";
return 0;
}
最良のものではないかもしれませんが、ポイントを示しています。
ボーナスアンダーハンド
等号を印刷する代わりに、2つの変数(aModとbMod)だけを印刷して、2つの変数を比較して等しいかどうかを確認するコードを作成できますが、実際にはそれらは等しい(およびの形式を印刷しますtrue
)。
これは人気コンテストであるため、最大数の賛成票が勝ちます。
また、数学2.0と呼ばれる数学の新しいバージョンでは、標準の抜け穴を利用して自動的に証明が無効になりました。