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; }
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; }