Пример #1
0
int run_mzed_cling(void *_p, unsigned long long *data, int *data_len) {
  struct smallops_params *p = (struct smallops_params *)_p;
  *data_len = 2;

  gf2e *ff = gf2e_init(irreducible_polynomials[p->k][1]);

  mzd_slice_t *a = mzd_slice_init(ff,p->m,p->n);
  mzd_slice_randomize(a);
  mzed_t *A = mzed_init(ff, p->m, p->n);

  data[0] = walltime(0);
  data[1] = cpucycles();

  mzed_cling(A, a);

  data[1] = cpucycles() - data[1];
  data[0] = walltime(data[0]);

  mzed_free(A);
  mzd_slice_free(a);

  gf2e_free(ff);
  return 0;
}
Пример #2
0
rci_t mzd_slice_echelonize_ple(mzd_slice_t *A, int full) {
	mzp_t *P = mzp_init(A->nrows);
	mzp_t *Q = mzp_init(A->ncols);
	rci_t r;

	if(full) {
		r = mzd_slice_pluq(A, P, Q);

		mzd_slice_t *U = mzd_slice_init_window(A, 0, 0, r, r);
		const rci_t r_radix = m4ri_radix*(r/m4ri_radix);

		if(r_radix == r && r!=A->ncols) {
			mzd_slice_t *B = mzd_slice_init_window(A, 0, r, r, A->ncols);
			for(rci_t i = 0; i < r; ++i)
				mzd_slice_write_elem(U, i, i, 1);
			mzd_slice_trsm_upper_left(U, B);
			mzd_slice_free_window(B);
		} else if (r_radix != r && r!=A->ncols) {
			assert(r_radix < r);

			if(A->ncols > r_radix+m4ri_radix) {
				mzd_slice_t *B0  = mzd_slice_submatrix(NULL, A, 0, r_radix, r, r_radix+m4ri_radix);
				mzd_slice_t *B0w = mzd_slice_init_window(    A, 0, r_radix, r, r_radix+m4ri_radix);
				mzd_slice_t *B1  = mzd_slice_init_window(A, 0, r_radix+m4ri_radix, r, A->ncols);

				for(rci_t i = 0; i < r; ++i)
					mzd_slice_write_elem(U, i, i, 1);

				mzd_slice_trsm_upper_left(U, B0);
				mzd_slice_trsm_upper_left(U, B1);

				mzd_slice_copy(B0w, B0);
				mzd_slice_free(B0);
				mzd_slice_free_window(B0w);
				mzd_slice_free_window(B1);

			} else {
				mzd_slice_t *B = mzd_slice_submatrix(NULL, A, 0, r_radix, r, A->ncols);
				mzd_slice_t *Bw = mzd_slice_init_window(A, 0, r_radix, r, A->ncols);

				for(rci_t i = 0; i < r; ++i)
					mzd_slice_write_elem(U, i, i, 1);

				mzd_slice_trsm_upper_left(U, B);

				mzd_slice_copy(Bw, B);
				mzd_slice_free_window(Bw);
				mzd_slice_free(B);     
			}
		}

		mzd_slice_set_ui(U, 1);

		mzd_slice_free_window(U);

		if(r) {
			mzd_slice_t *A0 = mzd_slice_init_window(A, 0, 0, r, A->ncols);
			mzd_slice_apply_p_right(A0, Q);
			mzd_slice_free_window(A0);
		}

	} else {
		r = mzd_slice_ple(A, P, Q);

		for(rci_t i = 0; i < r; ++i) {
			for(int e=0; e < A->depth; e++) {
				for(rci_t j = 0; j <= i; j++) {
					int const length = MIN(m4ri_radix, i - j + 1);
					mzd_clear_bits(A->x[e], i, j, length);
				}
			}
			mzd_slice_write_elem(A, i, Q->values[i], 1);
		}
	}

	if(r != A->nrows) {
		mzd_slice_t *R = mzd_slice_init_window(A, r, 0, A->nrows, A->ncols);
		mzd_slice_set_ui(R, 0);
		mzd_slice_free_window(R);
	}

	mzp_free(P);
	mzp_free(Q);

	return r;
}