对等式 gcd(x,y)=x⊕y 的一点思考

前日打算法赛时遇到了一个等式 gcd ⁡ ( x , y ) = x ⊕ y \gcd(x, y) = x \oplus y gcd(x,y)=xy,要求给定 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) a1=(a1)

利用这个定理,再由 异或的可交换性 和 大于2且相邻的两个数必互质,故当 x x x 为奇数时, y = x − 1 y=x-1 y=x1 即满足等式条件。

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)=xy 的正整数 y y y,我们需要检查 gcd ⁡ ( x , y ) \gcd(x, y) gcd(x,y) x ⊕ y x \oplus y xy 的二进制表示。

  1. 二进制性质:

    • x x x 的二进制表示只有一位是 1,其余全是 0。
    • y y y 是一个正整数,具有任意的二进制表示。
  2. 按位异或的性质:

    • x ⊕ y x \oplus y xy 表示 x x x y y y 之间的按位异或操作,对于相同位是 0,不同位是 1。
    • 由于 x x x 只有一位是 1,所以 x ⊕ y x \oplus y xy 会在 x x x 的那个 1 位与 y y y 的相应位不同时为 1,否则为 0。
  3. 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)=xy。由于 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 0m,n,...k 均为整数。

  • gcd ⁡ ( x , y ) \gcd(x, y) gcd(x,y) 必须是 2 的某个幂,因为 x x x y y y 的公因子只能是 2 的幂。
  • x ⊕ y x \oplus y xy 如果有多于一位 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)=xy 不能成立,因为 x ⊕ y x \oplus y xy 不可能保持 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=2km,其中 m m m 是奇数且 k > 0 k > 0 k>0

  1. 寻找 x x x 最多能被 2 的多少次方整除:

    • x x x 可以被 2 k 2^k 2k 整除,因为 x = 2 k ⋅ m x = 2^k \cdot m x=2km
    • 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=x2k=2km2k=2k(m1)
  2. 验证 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(2km,2k(m1))
    • 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(2km,2k(m1))=2kgcd(m,m1)
    • 由于 m m m ( m − 1 ) (m-1) (m1) 是相邻的整数,所以有 gcd ⁡ ( m , m − 1 ) = 1 \gcd(m, m - 1) = 1 gcd(m,m1)=1
    • 因此 gcd ⁡ ( x , y ) = 2 k \gcd(x, y) = 2^k gcd(x,y)=2k
  3. 验证 x ⊕ y x \oplus y xy:

    • x ⊕ y = 2 k ⋅ m ⊕ 2 k ( m − 1 ) x \oplus y = 2^k \cdot m \oplus 2^k (m - 1) xy=2km2k(m1)
    • 由于 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 xy=2k(m(m1))=2k

Part 4 : 综上所述

对于满足等式 g c d ( x , y ) = x ⊕ y gcd(x,y)=x⊕y gcd(x,y)=xy y y y

  • x x x 是奇数时,取 y = x − 1 y=x-1 y=x1 即满足条件
  • x x x 是偶数且为 2 的整数幂, y y y 不存在
  • x x x 是偶数但不是 2 的整数幂,选择 y = x − 2 k y = x - 2^k y=x2k 即满足条件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值