高斯消元与xor方程组

for(i=1;i<=n;i++)
{
  for(j=i+1;j<=n;j++)
    if(a[j]>a[i]) swap(a[i],a[j]);
  if(!a[i]) break;
  for(j=60;j>=0;j--)
    if(a[i]>>j&1)
    {
      for(k=1;k<=n;k++)
        if(i!=k && (a[k]>>j&1)) a[k]^=a[i];
      break;
    }
}

对着这个代码思(dan)考(teng)了一星期。。。

UPD:好像这两份代码干的事情一样?做完之后每一个数的最高位上只有这一个1。T_T谁能告诉我这两份代码有什么区别?各有什么用?还有为什么要这么做?

for(int i=1;i<=n;i++)
for(int j=64;j>=1;j--)
{
    if(a[i]>>(j-1)&1)
    {
        if(!lb[j]){lb[j]=a[i];break;}
        else a[i]^=lb[j];
    }
}

 

我们来证明一下,为什么消了元之后的a数组的任何一种选法对应原数组的一种选法?(SX问题,神犇请无视T_T)

假如我们有一个集合S=[x,S-{x}],那么对集合S选取的一种方案可以对应到S'=[x,{y^x|y∈{S-{x}}}]

令S-{X}=A,{y^x|y∈{S-{x}}}=B

因为假如这个方案

1)选x

    i)另外选了奇数个A中的元素,那么S‘中的方案对应为  不选x,在B中选对应的元素

    ii)另外选了偶数个A中的元素,那么S’中的方案对应为  选x,在B中选对应的元素

2)不选x

     i)另外选了奇数个A中的元素,那么S‘中的方案对应为  选x,在B中选对应的元素

     ii)另外选了偶数个A中的元素,那么S’中的方案对应为  不选x,在B中选对应的元素

所以这是一一对应的。所以我们就可以随便用某个方程取异或其它方程,选与不选还是相互独立且合法的。

(咦?我怎么想到了矩阵的初等变换?)

求大神给出简单证明T_T

posted @ 2015-01-18 16:28  ZYF-ZYF  Views(171)  Comments(6Edit  收藏  举报