int test_pluq_solve_left(rci_t m, rci_t n, int offsetA, int offsetB) {
    mzd_t* Abase = mzd_init(2048, 2048);
    mzd_t* Bbase = mzd_init(2048, 2048);
    mzd_randomize(Abase);
    mzd_randomize(Bbase);

    mzd_t* A = mzd_init_window(Abase, 0, offsetA, m, m + offsetA);
    mzd_t* B = mzd_init_window(Bbase, 0, offsetB, m, n + offsetB);

    // copy B
    mzd_t* Bcopy = mzd_init(B->nrows, B->ncols);
    for (rci_t i = 0; i < B->nrows; ++i)
        for (rci_t j = 0; j < B->ncols; ++j)
            mzd_write_bit(Bcopy,i,j, mzd_read_bit (B,i,j));

    for (rci_t i = 0; i < m; ++i) {
        mzd_write_bit(A,i,i, 1);
    }

    mzd_t *Acopy = mzd_copy(NULL, A);
    rci_t r = mzd_echelonize(Acopy,1);
    printf("solve_left m: %4d, n: %4d, r: %4d da: %4d db: %4d ", m, n, r, offsetA, offsetB);
    mzd_free(Acopy);
    Acopy = mzd_copy(NULL, A);

    int consistency = mzd_solve_left(A, B, 0, 1);

    //copy B
    mzd_t *X = mzd_init(B->nrows,B->ncols);
    for (rci_t i = 0; i < B->nrows; ++i)
        for (rci_t j = 0; j < B->ncols; ++j)
            mzd_write_bit(X,i,j, mzd_read_bit (B,i,j));

    mzd_t *B1 = mzd_mul(NULL, Acopy, X, 0);
    mzd_t *Z = mzd_add(NULL, Bcopy, B1);

    int status = 0;

    if(consistency == 0) {
        status = 1 - mzd_is_zero(Z);
        if (status == 0) {
            printf("passed\n");
        }  else {
            printf("FAILED\n");
        }
    } else {
        printf("skipped (no solution)\n");
    }
    mzd_free(Bcopy);
    mzd_free(B1);
    mzd_free(Z);

    mzd_free_window(A);
    mzd_free_window(B);
    mzd_free(Acopy);
    mzd_free(Abase);
    mzd_free(Bbase);
    mzd_free(X);
    return status;
}
int addmul_test_equality(rci_t m, rci_t l, rci_t n, int k, int cutoff) {
  int ret  = 0;
  mzd_t *A, *B, *C, *D, *E, *F;
  
  printf("addmul: m: %4d, l: %4d, n: %4d, k: %2d, cutoff: %4d", m, l, n, k, cutoff);

  /* we create two random matrices */
  A = mzd_init(m, l);
  B = mzd_init(l, n);
  C = mzd_init(m, n);
  mzd_randomize(A);
  mzd_randomize(B);
  mzd_randomize(C);

  /* D = C + A*B via M4RM, temporary buffers are managed internally */
  D = mzd_copy(NULL, C);
  D = mzd_addmul_m4rm(D, A, B, k);

  /* E = C + A*B via naiv cubic multiplication */
  E = mzd_mul_m4rm(NULL, A, B, k);
  mzd_add(E, E, C);

  /* F = C + A*B via naiv cubic multiplication */
  F = mzd_copy(NULL, C);
  F = mzd_addmul(F, A, B, cutoff);

  mzd_free(A);
  mzd_free(B);
  mzd_free(C);

  if (mzd_equal(D, E) != TRUE) {
    printf(" M4RM != add,mul");
    ret -=1;
  }
  if (mzd_equal(E, F) != TRUE) {
    printf(" add,mul = addmul");
    ret -=1;
  }
  if (mzd_equal(F, D) != TRUE) {
    printf(" M4RM != addmul");
    ret -=1;
  }

  if (ret==0)
    printf(" ... passed\n");
  else
    printf(" ... FAILED\n");


  mzd_free(D);
  mzd_free(E);
  mzd_free(F);
  return ret;
}
Exemple #3
0
/*
 * Class:     m4rjni_Mzd
 * Method:    mzd_equal
 * Signature: (JJ)I
 */
JNIEXPORT jlong JNICALL Java_m4rjni_Mzd_mzd_1add(JNIEnv *env, jclass obj, jlong Aptr, jlong Bptr) {
  mzd_t *A = (mzd_t*)Aptr;
  mzd_t *B = (mzd_t*)Bptr;
  if (A==NULL || B==NULL) return 0;
  return (jlong)mzd_add(NULL,A,B);
}
gf2matrix *add_matrices(gf2matrix *C, const gf2matrix *A, const gf2matrix *B)
{
	if (!A || !B)
		return NULL;
	return mzd_add(C, (mzd_t *) A, (mzd_t *) B);
}
int smallops_test_add(rci_t M, rci_t N, rci_t m, rci_t n, rci_t offset, word pattern) {
  int ret = 0; 

  printf("      mzd_add: M: %4d, N: %4d, m: %4d, n: %4d, offset: %4d, pattern: 0x%" PRIx64 " ", M, N, m, n, offset, pattern);

  mzd_t *AA;
  mzd_t *A = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &AA);

  mzd_t *BB;
  mzd_t *B = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &BB);

  mzd_t *CC;
  mzd_t *C = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &CC);

  mzd_t *DD;
  mzd_t *D = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &DD);

  /* Creation went okay? */

  ret += mzd_check_pattern(AA, m, n, offset, pattern);
  ret += mzd_check_pattern(BB, m, n, offset, pattern);
  ret += mzd_check_pattern(CC, m, n, offset, pattern);
  ret += mzd_check_pattern(DD, m, n, offset, pattern);

  /* Testing equality A+A == 0 */

  mzd_add(C, A, A);

  if(!mzd_is_zero(C)) {
    ret +=1;
  }

  ret += mzd_check_pattern(AA, m, n, offset, pattern);
  ret += mzd_check_pattern(BB, m, n, offset, pattern);
  ret += mzd_check_pattern(CC, m, n, offset, pattern);

  /* Testing equality A+A == 0 but this time C is already zero */

  mzd_add(C, B, B);

  if(!mzd_is_zero(C)) {
    ret +=1;
  }

  ret += mzd_check_pattern(AA, m, n, offset, pattern);
  ret += mzd_check_pattern(BB, m, n, offset, pattern);
  ret += mzd_check_pattern(CC, m, n, offset, pattern);

  /* Testing in place add. C is zero, so afterwards C == A */

  mzd_add(C, C, A);

  if(!mzd_equal(C,A)) {
    ret +=1;
  }

  ret += mzd_check_pattern(AA, m, n, offset, pattern);
  ret += mzd_check_pattern(BB, m, n, offset, pattern);
  ret += mzd_check_pattern(CC, m, n, offset, pattern);

  /* Testing equality C (== A) + A == 0 */

  mzd_add(B, C, A);

  if(!mzd_is_zero(B)) {
    ret +=1;
  }


  if(m == n) {
    /* Testing equality (A + B)^2 == A^2 + BA + AB + B^2 */

    mzd_randomize(A);
    mzd_randomize(B);
    
    mzd_add(C,A,B);
    
    mzd_mul(D,C,C, 0); // (A+B)^2
    
    mzd_mul(C,A,A, 0); 
    mzd_addmul(C, B, A, 0);
    mzd_addmul(C, A, B, 0);
    mzd_addmul(C, B, B, 0);
    
    if(!mzd_equal(C,D)) {
      ret += 1;
    }

    ret += mzd_check_pattern(AA, m, n, offset, pattern);
    ret += mzd_check_pattern(BB, m, n, offset, pattern);
    ret += mzd_check_pattern(CC, m, n, offset, pattern);
    ret += mzd_check_pattern(DD, m, n, offset, pattern);
  }

  mzd_free_test_matrix_random(AA, A);
  mzd_free_test_matrix_random(BB, B);
  mzd_free_test_matrix_random(CC, C);
  mzd_free_test_matrix_random(DD, D);

  if(ret == 0) {
    printf(" ... passed\n");
  } else {
    printf(" ... FAILED\n");
  }
#ifdef ABORT_ON_FAIL
  if (ret) abort();
#endif

  return ret;
}