당신은 이미 현명한 대답을 가지고 있습니다. 부호없는 산술은 모듈로 산술이므로 결과는 그대로 유지되며 수학적으로 증명할 수 있습니다.
하지만 컴퓨터의 멋진 점은 컴퓨터가 빠르다는 것입니다. 사실, 그들은 매우 빠르기 때문에 모든 유효한 32 비트 조합을 합당한 시간 내에 열거 할 수 있습니다 (64 비트로 시도하지 마십시오).
그래서, 당신의 경우, 저는 개인적으로 그것을 컴퓨터에 던지는 것을 좋아합니다. 수학적 증명이 정확 하고 사양 1 의 세부 사항을 감독하지 않았다는 것보다 프로그램이 정확하다는 것을 스스로 확신하는 데 걸리는 시간이 적습니다 .
#include <iostream>
#include <limits>
int main() {
std::uint64_t const MAX = std::uint64_t(1) << 32;
for (std::uint64_t i = 0; i < MAX; ++i) {
for (std::uint64_t j = 0; j < MAX; ++j) {
std::uint32_t const a = static_cast<std::uint32_t>(i);
std::uint32_t const b = static_cast<std::uint32_t>(j);
auto const champion = (a + (b & 255)) & 255;
auto const challenger = (a + b) & 255;
if (champion == challenger) { continue; }
std::cout << "a: " << a << ", b: " << b << ", champion: " << champion << ", challenger: " << challenger << "\n";
return 1;
}
}
std::cout << "Equality holds\n";
return 0;
}
이는 32 비트 공간에서 a
및의 가능한 모든 값을 열거 b
하고 동등성이 유지되는지 여부를 확인합니다. 그렇지 않으면 작동하지 않은 케이스를 인쇄하여 온 전성 검사로 사용할 수 있습니다.
그리고 Clang에 따르면 : Equality hold .
또한 산술 규칙이 비트 폭에 구애받지 않고 ( int
비트 폭 이상)이 동등성은 64 비트 및 128 비트를 포함하여 32 비트 이상의 부호없는 정수 유형에 대해 유지됩니다.
참고 : 컴파일러는 합리적인 시간 프레임에서 모든 64 비트 패턴을 어떻게 열거 할 수 있습니까? 그럴 순 없어. 루프가 최적화되었습니다. 그렇지 않으면 우리는 모두 처형이 끝나기 전에 죽었을 것입니다.
처음에는 16 비트의 부호없는 정수에 대해서만 증명했습니다. 불행히도 C ++는 작은 정수 (보다 작은 비트 폭 int
)가 먼저 int
.
#include <iostream>
int main() {
unsigned const MAX = 65536;
for (unsigned i = 0; i < MAX; ++i) {
for (unsigned j = 0; j < MAX; ++j) {
std::uint16_t const a = static_cast<std::uint16_t>(i);
std::uint16_t const b = static_cast<std::uint16_t>(j);
auto const champion = (a + (b & 255)) & 255;
auto const challenger = (a + b) & 255;
if (champion == challenger) { continue; }
std::cout << "a: " << a << ", b: " << b << ", champion: "
<< champion << ", challenger: " << challenger << "\n";
return 1;
}
}
std::cout << "Equality holds\n";
return 0;
}
그리고 다시 한번 Clang에 따르면 : Equality hold .
글쎄, 당신은 간다 :)
1 물론, 프로그램이 실수로 정의되지 않은 동작을 트리거하는 경우 그다지 증명되지 않습니다.
Math.random()
[0,1)에서 정수 또는 double을 반환 합니까 ? 나는 당신의 대본이 (내가 말할 수있는 가장 좋은) 당신이 제기 한 문제를 전혀 반영하지 않는다고 생각합니다.