- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 41282
- 在线时间
- 小时
|
楼主 |
发表于 2014-3-21 14:56:03
|
显示全部楼层
- ME[j]^=ME[t];
- }
- }
- t++;
- }
- }
- for(;t<m;t++){
- if(ME[t]!=0){
- failed=1;
- break;
- }
- }
- fprintf(stderr,"Freedom factor = %d\n", freedom_count);
- if(failed){
- printf("NO SOLUTION\n");
- free(freedom_index);
- return;
- }
- if(freedom_count>0){
- int delta=freedom_count;
- for(k=m-1,t=freedom_count-1;k>=0&&delta>0;k--){
- if(k==freedom_index[t]){
- int i;
- for(i=0;i<m;i++)P[k][i]=0;
- ME[k]=0;
- delta--;t--;
- }else if(delta>0){
- for(i=0;i<m;i++)P[k][i]=P[k-delta][i];
- ME[k]=ME[k-delta];
- }
- }
- }
- //Now ME hold's one solution for X[n],
- //And random reset index inside freedom_index of ME to 0, 1
- // will result in another solution for X[n];
- //Output one solution
- #ifdef _DEBUG
- printf("ME:");vector_output(ME, m);printf("\n");
- printf("H:\n");matrix_output(H,m);
- printf("init:\n");
- matrix_output(init,m);
- #endif
- unsigned long long *any_root = (unsigned long long *)malloc(longlong_len*sizeof(unsigned long long));
- unsigned long long *base = (unsigned long long *)malloc(longlong_len *sizeof(unsigned long long) *freedom_count);
- // if(freedom_count>=20)freedom_count=20;//do not search too much, so if the freedom_count is more than 15, the output may not be optimal
- long long u;
- int best_one_count=n*m+1;
- MATRIX bm=matrix_alloc2(n,m);
- for(u=0;u<1LL;u++)//calculate only one roots
- {
- MATRIX x=matrix_alloc2(n,m);
- vector_copy(x[n-1],ME,m);
- for(k=0;k<freedom_count;k++){
- if(u&(1<<k)){
- x[n-1][freedom_index[k]]=1;
- for(i=0;i<m;i++){
- if(P[i][freedom_index[k]]!=0){
- x[n-1][i]^=1;
- }
- }
- }else{
- x[n-1][freedom_index[k]]=0;
- }
- }
- matrix_mul_vector(x[n-2],H,x[n-1],m);
- vector_sum(x[n-2],init[n-1],m);
- for(k=n-3;k>=0;k--){
- H_mul_vector(x[k],x[k+1],m);
- #ifdef _DEBUG
- printf("x[%d] 1:",k);vector_output(x[k],m);printf("\n");
- #endif
- vector_sum(x[k],init[k+1],m);
- #ifdef _DEBUG
- printf("x[%d] 2:",k);vector_output(x[k],m);printf("\n");
- #endif
- vector_sum(x[k],x[k+2],m);
- #ifdef _DEBUG
- printf("x[%d] 3:",k);vector_output(x[k],m);printf("\n");
- #endif
- }
- copy_matrix_to_bit_string(x, m, n, any_root, longlong_len);
- matrix_free(x);
- }
- for(u=0;u<freedom_count;u++){
- MATRIX x=matrix_alloc2(n,m);
- for(k=0;k<m;k++)x[n-1][k]=0;
- x[n-1][freedom_index[u]]=1;//only set one value to bit 1
- for(i=0;i<m;i++){
- if(P[i][freedom_index[u]]!=0){
- x[n-1][i]^=1;
- }
- }
- matrix_mul_vector(x[n-2],H,x[n-1],m);
- for(k=n-3;k>=0;k--){
- H_mul_vector(x[k],x[k+1],m);
- vector_sum(x[k],x[k+2],m);
- }
- copy_matrix_to_bit_string(x, m, n, base+u*longlong_len, longlong_len);
- matrix_free(x);
- }
- search_base_result(any_root, base, freedom_count, longlong_len);
- matrix_free(bm);
- free(freedom_index);
- free(any_root);
- free(base);
- }
- void parse(int argc, char **argv, int *pn,int *pm){
- if(argc == 2){
- int n = atoi(argv[1]);
- if(n<0||n>N){
- Usage(argv[0]);
- }else if(n<=1){
- printf("%d\n",n);
- exit(0);
- }else{
- init=matrix_alloc(n);
- matrix_init_const(init,1,n,n);
- *pn=*pm=n;
- return;
- }
- }else if(argc==3){
- int n = atoi(argv[1]);
- int m = atoi(argv[2]);
- if(n<0||n>N||m<0||m>N){
- Usage(argv[0]);
- }else if(n<=1||m<=1){
- printf("%d\n",n);
- exit(0);
- }else{
- init=matrix_alloc2(n,m);
- matrix_init_const(init,1,n,m);
- *pn=n;*pm=m;
- return;
- }
- }else{
- int n=argc-1;
- int i,j;
- int m=strlen(argv[1]);
- init=matrix_alloc2(n,m);
- for(i=0;i<n;i++){
- char *s=argv[i+1];
- if(strlen(s)!=m){
- matrix_free(init);
- Usage(argv[0]);
- }
- for(j=0;j<m;j++){
- if(s[j]!='0'&&s[j]!='1'){
- matrix_free(init);
- Usage(argv[0]);
- }
- init[i][j]=s[j]-'0';
- }
- }
- *pm=m;*pn=n;
- return;
- }
- }
- int main(int argc, char **argv){
- int n,m;
- int i;
- MATRIX temp_matrix;
- VECTOR temp_vector;
- if(argc<2){
- Usage(argv[0]);
- }
- parse(argc,argv,&n,&m);
- #ifdef _DEBUG
- printf("Input:\n");
- matrix_output2(init,n,m);
- #endif
- ME = vector_alloc(m);
- temp_vector = vector_alloc(m);
- P0 = matrix_alloc(m);
- P1 = matrix_alloc(m);
- H = matrix_alloc(m);
- temp_matrix = matrix_alloc(m);
- matrix_init_H(H,m);
- matrix_init_E(P0,m);
- matrix_init_H(P1,m);
- #ifdef _DEBUG
- printf("P(0):\n");matrix_output(P0,m);
- printf("P(1):\n");matrix_output(P1,m);
- #endif
- matrix_mul_vector(ME, P0, init[0], m);
- matrix_mul_vector(temp_vector, P1, init[1], m);
- #ifdef _DEBUG
- printf("M(0):");vector_output(ME,m);printf("\n");
- printf("M(1):");vector_output(temp_vector,m);printf("\n");
- #endif
- vector_sum(ME,temp_vector,m);
- #ifdef _DEBUG
- printf("S(1):");vector_output(ME,m);printf("\n");
- #endif
- for(i=2;i<=n;i++){
- matrix_mul_H(temp_matrix,P1,m);
- matrix_sum(temp_matrix,P0,m);//P(k)= H*P(k-1) + P(k-2)
- matrix_copy(P0,P1,m);
- matrix_copy(P1,temp_matrix,m);
- #ifdef _DEBUG
- printf("P(%d):\n",i);matrix_output(P1,m);
- #endif
- if(i<n){
- matrix_mul_vector(temp_vector, P1, init[i], m);
- vector_sum(ME,temp_vector,m);
- #ifdef _DEBUG
- printf("M(%d):",i);vector_output(temp_vector,m);printf("\n");
- printf("S(%d):",i);vector_output(ME,m);printf("\n");
- #endif
- }
- }
- Solve(P1, ME, n,m);
- matrix_free(init);
- vector_free(ME);
- vector_free(temp_vector);
- matrix_free(P0);
- matrix_free(P1);
- matrix_free(H);
- matrix_free(temp_matrix);
- return 0;
- }
复制代码 |
|