将某些整数的xor设为零所需的最小总和

时间:2012-09-29 19:01:41

标签: algorithm xor

这是一个处理算法和按位xor运算的问题。 我们得到 x1*x2*x3*....*xn=P ,其中star(*)操作表示XOR(按位)操作, x1到xn是正整数。 P也是正整数。我们需要找到min(a1 + a2 + a3 + ..... an) ,以便这种关系成立 - >的 (x1+a1)*(x2+a2)*(x3+a3)*....*(xn+an)=0 即可。 '+'表示正常的加法操作。

3 个答案:

答案 0 :(得分:4)

重述为有界整数线性规划问题

这个问题可以重写为以下有界ILP(整数线性规划)问题。

Let x1,...,xN be as in the original problem, i.e. the goal is to minimize(a1+...+aN)
under the conditions (x1+a1) XOR ... (xN+aN) = 0, a1,...,aN >= 0.

The following is than an equivalent bounded ILP:
Find b[k,i] (0 <= k <= K, 1 <= i <= N) and s[k] (0 <= k <= K) such that
  (A) b[k,i] in {0, 1} for all i=1..n, k=0..K,
  (B) s[k] is an integer >= 0 for all k=0..K,
  (C) sum(b[k,i]*2^k, k=0..K) >= x[i] for all i = 1..N,
  (D) sum(b[k,i], i=1..N) = 2*s[k] for all k = 0..K
and minimize
  sum(b[k,i]*2^k, i=1..n, k=0..K).

From a solution of the bounded ILP the ai's are obtained by
  a[i] = sum(b[k,i]*2^k, k=0..(K-1)) - x[i]

b [k,i]这里简单地是(xi + ai)的二进制表示的第k位(条件(A)和(C))。为了使整体XOR为零,每k的偶数b [k,i]必须为1。这由条件(B)和(D)表示。 (注意,(D)中的左手和必须是偶数,它等于2 * s [k]且s [k]是整数。)

K,即必须预先确定表示所有(xi + ai)所需的位数(实际上加1)。挑选K使得所有xi都<1。 2 ^ K应该足够,即ai比最大的xi大一点。但是选择一个更大的K并不重要,顶部位将简单地归零。如果将K选择为小,则ILP将没有解决方案。

解决方案的存在

忽略最小条件,问题可以重写为

  

给定x,y z,其中x <= y,找到a和b使得(x + a)XOR(y + b)= z

给出原始问题的实例,N> = 2.设x = x1,y = x2,z =(x3 XOR x4 XOR ... xn)。如果找到合适的a和b,设置a1 = a,a2 = b,a3 = ... = an = 0以获得原问题的解。

解决了简化问题(再次,忽略最小化)
  1. 如果(y XOR z)> = x则a:=((y XOR z) - x),b:= 0是解(*)
  2. 如果(x XOR z)> = y则a:= 0,b:=((x XOR z) - y)是解(*)
  3. 否则,选择a(x + a)XOR z> = y。这样的a总是存在的,你可以例如让a:= 2 ^ k with 2 ^ k&gt; MAX(X,Y,Z)。设置b:=((x + a)XOR z) - y)产生解(*)
  4. (*)要看到那些真的是解决方案,你只需要应用一些代数。例如,在情况(1)中,在替换a和b之后,得到:(x +(y XOR z)-x)XOR(y + 0)。这与:(y XOR z)XOR y相同,因此对应于:z。证明完毕案例(2)的工作方式类似。在情况(3)中,得到:(x + a)XOR(y +((x + a)XOR z)-y)=(x + a)XOR((x + a)XOR z)= z。

    这表明,对于N> = 2,解决方案始终存在。

    这些解决方案是否极少,我不知道。在情况(3)中,它显然取决于a的选择,所以至少你必须找出a的最佳选择。也许原始问题允许比简化问题更小的解决方案。不管怎样,也许这种重述有助于某人找出完整的解决方案。

    顺便说一句,事实上,原始问题基本上让你完全自由地如何“展开”修正值ai超过xi,这让我想知道这是否等同于某种背包问题。如果是这样,找到一个最小的解决方案很可能是NP难的。

    关于最小性的观察

    采取以下问题

    (1+a1) XOR (3+a2) XOR (6+a3) = 0
    

    二进制,即

    (001b+a1) XOR (011b+a2) XOR (110b+a3) = 0
    

    a1 = a2 = a3 = 0的残基是001b XOR 011b XOR 110b = 100b。因此,一个明显的解决方案是a1 = 4,a2 = 0,a3 = 0。或者,a1 = 0,a2 = 4,a3 = 0。此解决方案最小 - 但以下解决方案较小

    a1=1, a2=1, a3=0
    

    它也很小,因为所有较小的解决方案只能有一个非零ai,所有术语(2 XOR 3 XOR 6),(1 XOR 4 XOR 6),(1 XOR 3 XOR 7)都是非-Zero。

    这表明从底部(即最低位)向上工作的绿色算法不起作用,因为这样的算法会跳过前两位,因为它们的残差最初为零。

    它还显示您无法从残差中选择某个非零位 k 并尝试将 2 ^ k 添加到 one < xi的/ em>。有时你必须将它添加到多个xi中才能找到最小的解决方案。

    这使我更加倾向于相信找到一个最小的解决方案是一个相对困难的问题。

答案 1 :(得分:1)

参考我的评论 - 尚未回答的问题:

  1. 负ai似乎是必要的:对于N = 1的情况,a1 = -x1是问题的解决方案。因此,我认为在一般情况下也允许使用负面的ai。

  2. 然后,对于N = 2,根本没有解决方案(“min”),除了可以在计算机中表示什么(负数)的数量有限:

  3. 对于N = 2,设定:a1 = x2 + K,a2 = x1 + K.这会产生:

    (x1 + x2 + K)XOR(x2 + x1 + K)= 0,与K无关

    总和(a1 + a2)=(x1 + x2 + 2 * K)

    没有最低限度的解决方案:我们可以使K更负面。

    同样地,对于N&gt; 2:对于N even,对于N = 2(具有任意K'),使用成对的“解”;对于N个奇数,单个一个 - 将其视为N = 1 - 并且剩余的N-1处理为偶数N.

    在所有情况下,你构造ZERO XOR ZERO XOR ZERO ... = ZERO, 其中ZERO总是一对类型(am = xm + 1 + K; am + 1 = xm + K),除非N是奇数,其中你有另一个因子,即类型{am = -xm) 。 除了N = 1,解决方案可以变得像你想要的那样大。

答案 2 :(得分:1)

也许第一次进入最小值 - N> 1,所有a(i)为正 - 沿着以下几行。我先说一些术语。

初始化y(i)= x(i); y(i)代表(x(i)+ a(i)),因此我们实际上初始化a(i)= 0(对于i = 1..N)。 同样,定义Q = y(1)^ y(2)^ ... ^ y(N)(^代表XOR);最初Q = P。

我们将调整y(i)使Q为零,始终保留y(i)&gt; = x(i) - 即:a(i)&gt; = 0.

考虑每个数字(x,y,a,P,Q)的二进制(位)扩展,将位数乘以m = 0,1,2,...:位m代表2 ** m值 - 编号。

注意,当且仅当具有相同位非零的y(i)的数量为奇数时,Q中的位才为非零。

请按以下步骤操作。扫描Q中的有问题的位(值1),自上而下,即:从最高(“当前剩余的”)位开始,为1.将此位设为#m。

我们有两个案例:

案例A.至少有一个y(i)的位m为零。将C定义为所有y(i)的集合。

我们将选择其中一个(见下文)并将其m位设置为1,即更改

 y(i) = y(i)+(2**m). For the moment, just define INCREMENT=(2**m).

为了确定我们在集合C中的选择y(i),我们尝试用尽可能大的DECREMENT部分补偿INCREMENT(2 ** m):

迭代位m-1,m-2,...直到我们有一个位#n,其中(1.)Q有一个1(即:我们希望删除的另一个违规位),和(2) 。)C中的y(i)中至少有一个也有1。

如果成功,则(1.)设置:

INCREMENT = INCREMENT - 2**n (note that this remains positive);

(2。)减少集合C以仅保留那些具有#n非零的y(i); (3)重复该过程,进一步扫描这些位。

一旦我们不能继续进行,从C中任意挑选剩余的y(i)中的一个并通过INCREMENT增加它。更新Q.通过添加

从Q中删除位{m,n,...}
 (2**m - 2**n - ...)

选择y(i),将其位#m设置为1(它为0),将其位n,...设置为0(这些为1)。

案例B. y(i)中没有一个位#m为零。在这种情况下:

迭代比特k = m + 1,m + 2,...直到至少两个y(i)在该比特中具有零。将C1定义为所有y(i)的集合,并复制到集合C2。还要定义

INCREMENT1 as (2**k - 2**m) and set INCREMENT2 = 2**k.

处理{C1,INCREMENT1},就像我们在案例A中所做的那样。

从集合C2中删除最终选择y(i)。然后同样处理{C2,INCREMENT2}。

重复所有这一切,直到Q中的所有位都为零。

我没有试图证明这个程序产生真正的最小值,但我确实认为这种方法可能是思考这种证明(结构)的良好起点。