前日打算法赛时遇到了一个等式 gcd ( x , y ) = x ⊕ y \gcd(x, y) = x \oplus y gcd(x,y)=x⊕y,要求给定 x x x 在最短时间内求得满足条件的一个 y y y 。
赛中使用了暴力找规律大法过了,赛后决定认真严谨证明一下满足条件的 y y y 的相关性质,于是有了这篇文章(
Part 1: x x x 是奇数
先介绍【异或配对性定理】:若 a a a 为任意非负偶数,则必有 a ⊕ 1 = ( a − 1 ) a⊕1=(a-1) a⊕1=(a−1) 。
利用这个定理,再由 异或的可交换性 和 大于2且相邻的两个数必互质,故当 x x x 为奇数时, y = x − 1 y=x-1 y=x−1 即满足等式条件。
Part 2: x x x 是偶数且为 2 的整数幂
设 x = 2 k x = 2^k x=2k,其中 k k k 是非负整数。由于 x x x 是 2 的整数幂,二进制表示中只有一位是 1,其余位均为 0 。
为了找出满足 gcd ( x , y ) = x ⊕ y \gcd(x, y) = x \oplus y gcd(x,y)=x⊕y 的正整数 y y y,我们需要检查 gcd ( x , y ) \gcd(x, y) gcd(x,y) 和 x ⊕ y x \oplus y x⊕y 的二进制表示。
-
二进制性质:
- x x x 的二进制表示只有一位是 1,其余全是 0。
- y y y 是一个正整数,具有任意的二进制表示。
-
按位异或的性质:
- x ⊕ y x \oplus y x⊕y 表示 x x x 和 y y y 之间的按位异或操作,对于相同位是 0,不同位是 1。
- 由于 x x x 只有一位是 1,所以 x ⊕ y x \oplus y x⊕y 会在 x x x 的那个 1 位与 y y y 的相应位不同时为 1,否则为 0。
-
gcd \gcd gcd 的性质:
- gcd ( x , y ) \gcd(x, y) gcd(x,y) 是 x x x 和 y y y 的最大公约数。
- 由于 x x x 是 2 的整数幂,因此 x x x 的所有因子也都是 2 的整数幂。
现在假设存在一个正整数 y y y,使得 gcd ( x , y ) = x ⊕ y \gcd(x, y) = x \oplus y gcd(x,y)=x⊕y。由于 x x x 所有因子都必须是 2 的幂。假设 y = 2 m + 2 n + ⋯ y = 2^m + 2^n + \cdots y=2m+2n+⋯,其中 0 ≤ m , n , . . . ≤ k 0\leq m, n, ... \leq k 0≤m,n,...≤k 均为整数。
- gcd ( x , y ) \gcd(x, y) gcd(x,y) 必须是 2 的某个幂,因为 x x x 和 y y y 的公因子只能是 2 的幂。
- x ⊕ y x \oplus y x⊕y 如果有多于一位 1,则不是 2 的幂,不能是 gcd ( x , y ) \gcd(x, y) gcd(x,y)。
因此 gcd ( x , y ) = x ⊕ y \gcd(x, y) = x \oplus y gcd(x,y)=x⊕y 不能成立,因为 x ⊕ y x \oplus y x⊕y 不可能保持 2 的幂的形式,而 gcd ( x , y ) \gcd(x, y) gcd(x,y) 必须是 2 的幂。
Part 3: x x x 是偶数但不是 2 的整数幂
设 x = 2 k ⋅ m x = 2^k \cdot m x=2k⋅m,其中 m m m 是奇数且 k > 0 k > 0 k>0 。
-
寻找 x x x 最多能被 2 的多少次方整除:
- x x x 可以被 2 k 2^k 2k 整除,因为 x = 2 k ⋅ m x = 2^k \cdot m x=2k⋅m
- y = x − 2 k = 2 k ⋅ m − 2 k = 2 k ( m − 1 ) y = x - 2^k = 2^k \cdot m - 2^k = 2^k(m - 1) y=x−2k=2k⋅m−2k=2k(m−1)
-
验证 gcd ( x , y ) \gcd(x, y) gcd(x,y):
- gcd ( x , y ) = gcd ( 2 k ⋅ m , 2 k ( m − 1 ) ) \gcd(x, y) = \gcd(2^k \cdot m, 2^k(m - 1)) gcd(x,y)=gcd(2k⋅m,2k(m−1))
- gcd ( 2 k ⋅ m , 2 k ⋅ ( m − 1 ) ) = 2 k ⋅ gcd ( m , m − 1 ) \gcd(2^k \cdot m, 2^k \cdot (m - 1)) = 2^k \cdot \gcd(m, m - 1) gcd(2k⋅m,2k⋅(m−1))=2k⋅gcd(m,m−1)
- 由于 m m m 和 ( m − 1 ) (m-1) (m−1) 是相邻的整数,所以有 gcd ( m , m − 1 ) = 1 \gcd(m, m - 1) = 1 gcd(m,m−1)=1
- 因此 gcd ( x , y ) = 2 k \gcd(x, y) = 2^k gcd(x,y)=2k
-
验证 x ⊕ y x \oplus y x⊕y:
- x ⊕ y = 2 k ⋅ m ⊕ 2 k ( m − 1 ) x \oplus y = 2^k \cdot m \oplus 2^k (m - 1) x⊕y=2k⋅m⊕2k(m−1)
- 由于 x x x 和 y y y 只有 2 k 2^k 2k 的系数不同,其余相同。(即左移位数相同)
- 因此 x ⊕ y = 2 k ⋅ ( m ⊕ ( m − 1 ) ) = 2 k x \oplus y = 2^k\cdot(m \oplus (m-1))=2^k x⊕y=2k⋅(m⊕(m−1))=2k
Part 4 : 综上所述
对于满足等式 g c d ( x , y ) = x ⊕ y gcd(x,y)=x⊕y gcd(x,y)=x⊕y 的 y y y:
- 当 x x x 是奇数时,取 y = x − 1 y=x-1 y=x−1 即满足条件
- 当 x x x 是偶数且为 2 的整数幂, y y y 不存在
- 当 x x x 是偶数但不是 2 的整数幂,选择 y = x − 2 k y = x - 2^k y=x−2k 即满足条件