コード例 #1
0
void
dirichlet_prime_group_init(dirichlet_prime_group_struct * P, ulong p, int e)
{
    P->p = p;
    P->e = e;
    if (p == 2 || p == 4)
    {
        P->p = 2;
        nmod_init(&P->pe, 1 << e);
        if (p == 2)
        {
            P->e = 2;
            nmod_init(&P->phi, 2);
            P->g = (1 << e) - 1;
        }
        else
        {
            nmod_init(&P->phi, 1 << (e - 2));
            P->g = 5;
        }
    }
    else
    {
        ulong pe1;
        pe1 = n_pow(p, e - 1);
        nmod_init(&P->phi, (p-1) * pe1);
        nmod_init(&P->pe, p * pe1);
        P->g = primitive_root_p_and_p2(p);
    }
    P->dlog = NULL;
}
コード例 #2
0
ファイル: rho_init.c プロジェクト: fredrik-johansson/arb
void
dlog_rho_init(dlog_rho_t t, ulong a, ulong mod, ulong n)
{
    t->a = a;
    nmod_init(&t->n, n);
    nmod_init(&t->mod, mod);
    t->nisprime = n_is_prime(n);
}
コード例 #3
0
ファイル: p-reduce.c プロジェクト: goens/flint2
void sample(void * arg, ulong count)
{
   mp_limb_t n;
   nmod_t mod;
   info_t * info = (info_t *) arg;
   mp_bitcnt_t bits = info->bits;
   mp_ptr vec = _nmod_vec_init(1000);
   mp_ptr vec2 = _nmod_vec_init(1000);
   mp_size_t j;
   long i;
   flint_rand_t state;
   flint_randinit(state);
    
   for (j = 0; j < 1000; j++)
      vec[j] = n_randlimb(state);

   prof_start();
   for (i = 0; i < count; i++)
   {
      n = n_randbits(state, bits);
      if (n == 0UL) n++;
      
	  nmod_init(&mod, n);
      _nmod_vec_reduce(vec2, vec, 1000, mod);
   }
   prof_stop();
 
   flint_randclear(state);
   _nmod_vec_clear(vec);
   _nmod_vec_clear(vec2);
}
コード例 #4
0
ファイル: test_find_root.c プロジェクト: defeo/ff_compositum
/*------------------------------------------------------------*/
void check(int opt){
  long i;
  flint_rand_t state;
  flint_randinit(state);

  mp_limb_t n = 65537;
  nmod_t mod;
  nmod_init(&mod, n);

  for (i = 1; i < 2000; i+=30){

    if (opt == 1){
      mp_limb_t root = nmod_poly_find_root(i, mod);
      sage_output_init(mod);
      printf("root = k(%ld)\n", root);
      printf("root.multiplicative_order() > %ld\n", i);
    }
    else{
      double t;
      long j;
      t = util_gettime();
      for (j = 0; j < 10000; j++)
	 nmod_poly_find_root(i, mod);
      t = util_gettime()-t;

      printf("%ld %f\n", i, t);
    }
  }

  flint_randclear(state);
}
コード例 #5
0
ファイル: t-dot_ptr.c プロジェクト: goens/flint2
int
main(void)
{
    int i;
    flint_rand_t state;
    flint_randinit(state);

    printf("dot_ptr....");
    fflush(stdout);

    for (i = 0; i < 10000; i++)
    {
        long len;
        nmod_t mod;
        mp_limb_t m, res, res2;
        mp_ptr x, y;
        mp_ptr * z;
        int limbs1;
        long j, offset;

        len = n_randint(state, 1000) + 1;
        m = n_randtest_not_zero(state);
        offset = n_randint(state, 10);

        nmod_init(&mod, m);

        x = _nmod_vec_init(len);
        y = _nmod_vec_init(len);
        z = flint_malloc(sizeof(mp_ptr) * len);

        _nmod_vec_randtest(x, state, len, mod);
        _nmod_vec_randtest(y, state, len, mod);

        for (j = 0; j < len; j++)
            z[j] = &y[j] + offset;

        limbs1 = _nmod_vec_dot_bound_limbs(len, mod);

        res = _nmod_vec_dot_ptr(x, z, -offset, len, mod, limbs1);
        res2 = _nmod_vec_dot(x, y, len, mod, limbs1);

        if (res != res2)
        {
            printf("FAIL:\n");
            printf("m = %lu\n", m);
            printf("len = %ld\n", len);
            printf("limbs1 = %d\n", limbs1);
            abort();
        }

        _nmod_vec_clear(x);
        _nmod_vec_clear(y);
        flint_free(z);
    }

    flint_randclear(state);

    printf("PASS\n");
    return 0;
}
コード例 #6
0
ファイル: aring-zzp-flint.cpp プロジェクト: BertiniM2/M2
ARingZZpFlint::ARingZZpFlint(size_t p0) : mCharac(p0)
{
  nmod_init(&mModulus, p0);
  flint_randinit(mRandomState);
  fmpz_init(mFmpzCharac);
  fmpz_set_ui(mFmpzCharac, mCharac);
  mGenerator = n_primitive_root_prime(mCharac);
}
コード例 #7
0
ulong
dlog_crt_init(dlog_crt_t t, ulong a, ulong mod, ulong n, ulong num)
{
    int k;
    n_factor_t fac;
    ulong * M, * u;
    ulong cost = 0;

    n_factor_init(&fac);
    n_factor(&fac, n, 1);

    t->num = fac.num;
    nmod_init(&t->mod,mod);
    nmod_init(&t->n, n);

    M = t->expo = flint_malloc(t->num * sizeof(ulong));
    u = t->crt_coeffs = flint_malloc(t->num * sizeof(ulong));
    t->pre = flint_malloc(t->num * sizeof(dlog_precomp_struct));

    for (k = 0; k < t->num; k++)
    {
        ulong p, e, mk;
        p = fac.p[k];
        e = fac.exp[k];
        if (0 && mod % p == 0)
        {
            flint_printf("dlog_crt_init: modulus must be prime to order.\n");
            abort();
        }
        mk = n_pow(p, e);
        M[k] = n / mk;
        u[k] = nmod_mul(M[k], n_invmod(M[k] % mk, mk), t->n);
        /* depends on the power */
#if 0
        flint_printf("[sub-crt -- init for size %wu mod %wu]\n", mk, mod);
#endif
        dlog_precomp_pe_init(t->pre + k, nmod_pow_ui(a, M[k], t->mod), mod, p, e, mk, num);
        cost += t->pre[k].cost;
    }
#if 0
    if (cost > 500)
    flint_printf("[crt init for size %wu mod %wu -> cost %wu]\n", n,mod,cost);
#endif
    return cost;
}
コード例 #8
0
/*------------------------------------------------------------*/
void check(int opt){
  long i;
  flint_rand_t state;
  flint_randinit(state);
  mp_limb_t n = 65537;
  nmod_t mod;
  nmod_init(&mod, n);

  for (i = 1; i < 200; i+=1){

    mp_ptr val = _nmod_vec_init(i);
    mp_limb_t q = nmod_poly_find_root(i, mod);

    if (opt == 1){
      nmod_poly_eval_geom_derivative_fanin(val, q, i, mod);

      sage_output_init(mod);
      printf("q = k(%lu)\n", q);
      printf("i = %lu\n", i);
      sage_output_assign_vec(val, i, "val");
      printf("P = mul([x-q^j for j in range(i)])\n");
      printf("val == [P.derivative()(q^j) for j in range(i)]\n");
    }
    else{
      double t, u;
      long j;
      t = util_gettime();
      for (j = 0; j < 10000; j++)
	nmod_poly_eval_geom_derivative_fanin(val, q, i, mod);
      t = util_gettime() - t;
      
      nmod_poly_t tmp1, tmp2, tmp3;
      nmod_poly_init(tmp1, n);
      nmod_poly_init(tmp2, n);
      nmod_poly_init(tmp3, n);

      nmod_poly_rand_dense(tmp1, state, i);
      nmod_poly_rand_dense(tmp2, state, i);

      u = util_gettime();
      for (j = 0; j < 10000; j++)
	nmod_poly_mul(tmp3, tmp1, tmp2);
      u = util_gettime() - u;

      nmod_poly_clear(tmp1);
      nmod_poly_clear(tmp2);
      nmod_poly_clear(tmp3);
      
      printf("%lu %f %f\n", i, t, u);
    }

    _nmod_vec_clear(val);
  }

  flint_randclear(state);
}
コード例 #9
0
void
ring_init_mod(ring_t ring, const ring_t elem_ring, elem_srcptr modulus)
{
    ring->type = TYPE_MOD;
    ring->size = elem_ring->size;
    ring->parent = (ring_struct *) elem_ring;

    ring->modulus = (elem_ptr) modulus;   /* should this make a copy? */
    if (elem_ring->type == TYPE_LIMB)
        nmod_init(&ring->nmod, *((mp_ptr) modulus));
}
コード例 #10
0
ファイル: t-dot_bound_limbs.c プロジェクト: clear731/lattice
int
main(void)
{
    int i;
    FLINT_TEST_INIT(state);
    

    flint_printf("dot_bound_limbs....");
    fflush(stdout);

    for (i = 0; i < 1000000; i++)
    {
        slong len;
        nmod_t mod;
        mp_limb_t m;
        int limbs1, limbs2;
        mpz_t t;

        len = n_randint(state, 10000) + 1;
        m = n_randtest_not_zero(state);

        nmod_init(&mod, m);

        limbs1 = _nmod_vec_dot_bound_limbs(len, mod);

        mpz_init2(t, 4*FLINT_BITS);
        flint_mpz_set_ui(t, m-1);
        mpz_mul(t, t, t);
        flint_mpz_mul_ui(t, t, len);
        limbs2 = mpz_size(t);

        if (limbs1 != limbs2)
        {
            flint_printf("FAIL:\n");
            flint_printf("m = %wu\n", m);
            flint_printf("len = %wd\n", len);
            flint_printf("limbs1 = %d\n", limbs1);
            flint_printf("limbs2 = %d\n", limbs2);
            gmp_printf("bound: %Zd\n", t);
            abort();
        }

        mpz_clear(t);
    }

    FLINT_TEST_CLEANUP(state);
    
    flint_printf("PASS\n");
    return 0;
}
コード例 #11
0
void
acb_dirichlet_jacobi_sum_naive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec)
{

    ulong k1, k2, m1, m2, g, e, m;
    ulong * v1, * v2;
    slong *v;
    nmod_t expo;
    acb_t z;

    v1 = flint_malloc(G->q * sizeof(ulong));
    v2 = flint_malloc(G->q * sizeof(ulong));

    dirichlet_vec_set_null(v1, G, G->q);
    dirichlet_chi_vec_loop(v1, G, chi1, G->q);

    dirichlet_vec_set_null(v2, G, G->q);
    dirichlet_chi_vec_loop(v2, G, chi2, G->q);

    nmod_init(&expo, G->expo);
    m1 = dirichlet_order_char(G, chi1);
    m2 = dirichlet_order_char(G, chi2);
    g = m1 * m2 / n_gcd(m1, m2);
    m = G->expo / g;

    v = flint_malloc(g * sizeof(slong));

    for (e = 0; e < g; e++)
        v[e] = 0;

    for (k1 = 2, k2 = G->q - 1; k2 > 1; k1++, k2--)
    {
        if (v1[k1] == DIRICHLET_CHI_NULL ||
            v2[k2] == DIRICHLET_CHI_NULL)
            continue;
        e = nmod_add(v1[k1], v2[k2], expo) / m;
        v[e]++;
    }

    acb_init(z);
    acb_unit_root(z, g, prec);
    acb_dirichlet_si_poly_evaluate(res, v, g, z, prec);

    acb_clear(z);
    flint_free(v);
    flint_free(v2);
    flint_free(v1);
}
コード例 #12
0
ファイル: t-reduce.c プロジェクト: goens/flint2
int
main(void)
{
    int i, result;
    flint_rand_t state;
    flint_randinit(state);

    printf("reduce....");
    fflush(stdout);

    for (i = 0; i < 10000; i++)
    {
        long j, len = n_randint(state, 100) + 1;
        mp_ptr vec = _nmod_vec_init(len);
        mp_ptr vec2 = _nmod_vec_init(len);

        mp_limb_t n = n_randtest_not_zero(state);
        nmod_t mod;
        nmod_init(&mod, n);

        for (j = 0; j < len; j++)
        {
            vec[j] = n_randtest(state);
            vec2[j] = vec[j];
        }

        _nmod_vec_reduce(vec, vec, len, mod);
        for (j = 0; j < len; j++)
            vec2[j] = n_mod2_preinv(vec2[j], mod.n, mod.ninv);

        result = _nmod_vec_equal(vec, vec2, len);
        if (!_nmod_vec_equal(vec, vec2, len))
        {
            printf("FAIL:\n");
            printf("len = %ld, n = %ld\n", len, n);
            abort();
        }

        _nmod_vec_clear(vec);
        _nmod_vec_clear(vec2);
    }

    flint_randclear(state);

    printf("PASS\n");
    return 0;
}
コード例 #13
0
ファイル: t-bell_number_nmod.c プロジェクト: goens/flint2
int main(void)
{
    flint_rand_t state;
    long i, j;

    printf("bell_number_nmod....");
    fflush(stdout);

    flint_randinit(state);

    for (i = 0; i < 10; i++)
    {
        mp_ptr b;
        long n;
        nmod_t mod;
        mp_limb_t p;

        n = n_randint(state, 1000);
        p = n_randtest_prime(state, 0);

        nmod_init(&mod, p);

        b = _nmod_vec_init(n + 1);
        bell_number_nmod_vec(b, n + 1, mod);

        for (j = 0; j <= n; j++)
        {
            mp_limb_t u = bell_number_nmod(j, mod);

            if (u != b[j])
            {
                printf("FAIL: p = %lu, i = %ld\n", p, j);
                abort();
            }
        }

        _nmod_vec_clear(b);
    }

    flint_randclear(state);
    _fmpz_cleanup();
    printf("PASS\n");
    return 0;
}
コード例 #14
0
void
dirichlet_group_init(dirichlet_group_t G, ulong q)
{
    slong k;
    ulong e2;
    n_factor_t fac;

    G->q = q;
    nmod_init(&G->mod, q);


    e2 = n_remove(&q, 2);
    G->q_even = 1 << e2;
    /* number of components at p=2 */
    G->neven = (e2 >= 3) ? 2 : (e2 == 2) ? 1 : 0;

    /* warning: only factor odd part */
    n_factor_init(&fac);
    n_factor(&fac, q, 1);

    G->num = fac.num + G->neven;
    G->P = flint_malloc(G->num * sizeof(dirichlet_prime_group_struct));
    G->generators = flint_malloc(G->num * sizeof(ulong));
    G->PHI = flint_malloc(G->num * sizeof(ulong));

    /* even part */
    if (G->neven >= 1)
        dirichlet_prime_group_init(&G->P[0], 2, e2);
    if (G->neven == 2)
        dirichlet_prime_group_init(&G->P[1], 4, e2);

    /* odd part */
    G->rad_q = 1;
    for (k = G->neven; k < G->num; k++)
    {
        ulong p, e;
        p = fac.p[k - G->neven];
        e = fac.exp[k - G->neven];
        G->rad_q *= p;
        dirichlet_prime_group_init(&G->P[k], p, e);
    }
    dirichlet_group_lift_generators(G);
}
コード例 #15
0
ファイル: test_rand_dense.c プロジェクト: defeo/ff_compositum
/*------------------------------------------------------------*/
void check(int opt){
  long i;
  flint_rand_t state;
  flint_randinit(state);

  mp_limb_t n = 65537;
  nmod_t mod;
  nmod_init(&mod, n);

  for (i = 1; i < 1000; i+=3){
    mp_ptr v = _nmod_vec_init(i);
    nmod_vec_rand_dense(v, state, i, mod);

    if (opt == 1){
      sage_output_init(mod);
      sage_output_assign_vec(v, i, "v");
    }
    _nmod_vec_clear(v);
  }

  flint_randclear(state);
}
コード例 #16
0
ファイル: nmod_mat-mul.c プロジェクト: krisk0/razin
void
nmod_mat_multiplication_test_benchmark(
  slong dim0,slong dim1,slong dim2,
  mp_limb_t p,
  slong experiments)
 {
  assert(experiments >= 1);
  assert(dim2 > 1);
  clock_t t0,t1,t2,t3;
  slong i;
  mp_limb_t* update_me;
  nmod_mat_t A0,B0,C0,A1,B1,C1,C2;
  p_k_pk_t P; P.p=p;
  nmod_t M0,M1;
  flint_randinit(st);
  init__p_k_pk__and__nmod( &P, &M0 );
  nmod_init( &M1, P.p_deg_k );
  init_matrix(A0,B0, C0,C1,C2, dim0,dim1,dim2, M0);
  reduce_modulo( A1, A0, M1);
  reduce_modulo( B1, B0, M1);
  --experiments;
  memcpy( &C2->mod, &M1, sizeof(nmod_t) );
  memcpy( &C1->mod, &M1, sizeof(nmod_t) );
  t0=clock();
  CHAIN_MULT(experiments, nmod_mat_mul,    A1, B1, C2, C1);
  t1=clock();
  memcpy( &C2->mod, &M0, sizeof(nmod_t) );
  memcpy( &C0->mod, &M0, sizeof(nmod_t) );
  t2=clock();
  CHAIN_MULT(experiments, nmod_mat_mul_pk_classical, A0, B0, C2, C0);
  t3=clock();
  equality_check( C0, C1 );
  flint_printf("2**%w * %wu**%wu | %w %w %w: ",M1.norm,p,P.k,dim0,dim1,dim2);
  // ************************ Warning ************************
                                          // line below works on amd64/Linux,
  flint_printf("%w %w\n", t1-t0, t3-t2); //   because clock_t is slong
  // If clock_t is not integer, replace format string above with smth else
 }
コード例 #17
0
ファイル: bell_number_multi_mod.c プロジェクト: goens/flint2
void
bell_number_multi_mod(fmpz_t res, ulong n)
{
    fmpz_comb_temp_t temp;
    fmpz_comb_t comb;
    nmod_t mod;
    mp_ptr primes, residues;
    long k, size, prime_bits, num_primes;

    size = bell_number_size(n);
    prime_bits = FLINT_BITS - 1;
    num_primes = (size + prime_bits - 1) / prime_bits;

    primes = flint_malloc(num_primes * sizeof(mp_limb_t));
    residues = flint_malloc(num_primes * sizeof(mp_limb_t));

    primes[0] = n_nextprime(1UL << prime_bits, 0);
    for (k = 1; k < num_primes; k++)
        primes[k] = n_nextprime(primes[k-1], 0);

    for (k = 0; k < num_primes; k++)
    {
        nmod_init(&mod, primes[k]);
        residues[k] = bell_number_nmod(n, mod);
    }

    fmpz_comb_init(comb, primes, num_primes);
    fmpz_comb_temp_init(temp, comb);

    fmpz_multi_CRT_ui(res, residues, comb, temp, 0);

    fmpz_comb_clear(comb);
    fmpz_comb_temp_clear(temp);

    flint_free(primes);
    flint_free(residues);
}
コード例 #18
0
ファイル: test_print_poly.c プロジェクト: defeo/ff_compositum
/*------------------------------------------------------------*/
void check(int opt){

  mp_limb_t n = 12345;
  nmod_t Zn;
  nmod_init(&Zn, n);
  sage_output_init(Zn);

  nmod_poly_t a;
  nmod_poly_init2(a, n, 10);
  long i;
  for (i = 0; i < 10; i++)
    a->coeffs[i] = i;
  a->length = 10;
  _nmod_poly_normalise(a);

  sage_output_print_poly(a);
  printf("\n");

  nmod_poly_zero(a);
  sage_output_print_poly(a);
  printf("\n");

  nmod_poly_clear(a);
}
コード例 #19
0
int main(int argc, char *argv[])
{
    int out = LOG;
    int i, ni = 8;
    int bits[9] = { 10, 15, 20, 25, 30, 35, 40, 45, 50 };

    int j, nj = 6;
    ulong * v;
    ulong nv[6] = { 50, 200, 1000, 2000, 10000, 30000 };

    int k, np = NPRIMES;
    nmod_t * p;
    ulong * a;

    int l, nf = 5;
    vec_f func[5] = { f_empty, dlog_vec_loop, dlog_vec_eratos, dlog_vec_sieve, dlog_vec };
    char * n[5] = { "empty", "loop", "eratos", "sieve", "default" };

    flint_rand_t state;
    nmod_t order;

    nmod_init(&order, 100);
    p = flint_malloc(np * sizeof(nmod_t));
    a = flint_malloc(np * sizeof(ulong));

    flint_randinit(state);

    if (argc < 2)
        out = LOG;
    else if (!strcmp(argv[1], "json"))
        out = JSON;
    else if (!strcmp(argv[1], "csv"))
        out = CSV;
    else if (!strcmp(argv[1], "log"))
        out = LOG;
    else
    {
        printf("usage: %s [log|csv|json]\n", argv[0]);
        abort();
    }

    for (i = 0; i < ni; i++)
    {

        for (k = 0; k < np; k++)
        {
            nmod_init(&p[k], n_randprime(state, bits[i], 0));
            a[k] = n_primitive_root_prime(p[k].n);
        }

        for (j = 0; j < nj; j++)
        {

            v = flint_malloc(nv[j] * sizeof(ulong));

            if (out == LOG)
            {
                flint_printf("log(1..%wu) mod %d primes of size %d bits....\n", nv[j], np, bits[i]);
                fflush(stdout);
            }

            for (l = 0; l < nf; l++)
            {
                if (l == 1 && i > 2)
                    continue;
                if (l == 2 && i > 5)
                    continue;

                if (out == LOG)
                {
                    flint_printf("%-20s...   ",n[l]);
                    fflush(stdout);
                }
                else if (out == CSV)
                {
                    flint_printf("%-8s, %2d, %4d, %3d, ",n[l],bits[i],nv[j],np);
                }
                else if (out == JSON)
                {
                    flint_printf("{ \"name\": \"%s\", \"bits\": %d, \"nv\": %d, \"nprimes\": %d, \"time\": ",
                            n[l],bits[i],nv[j],np);
                }

                TIMEIT_ONCE_START

                for (k = 0; k < np; k++)
                {
                    int kk;

                    for (kk=0; kk < nv[j]; kk++)
                        v[kk] = 0;

                    (func[l])(v, nv[j], a[k], 1, p[k], p[k].n - 1, order);
                }

                TIMEIT_ONCE_STOP

                if (out == JSON)
                    flint_printf("}\n");
                else
                    flint_printf("\n");
            }
            flint_free(v);
        }
        np /= 2;
    }

    flint_free(p);
    flint_free(a);
    flint_randclear(state);
    flint_cleanup();
    flint_printf("PASS\n");
    return EXIT_SUCCESS;
}
コード例 #20
0
int main()
{
    slong bits, nv, iter;
    flint_rand_t state;
    int f, nf = 4;
    vec_f func[4] = { dlog_vec_trivial, dlog_vec_loop, dlog_vec_eratos,
        dlog_vec_sieve };
    char * n[4] = { "trivial", "loop", "eratos", "sieve" };


    flint_printf("vec....");
    fflush(stdout);
    flint_randinit(state);

    for (bits = 10; bits <= FLINT_MIN(35, FLINT_BITS); bits += 5)
    {

        for (nv = 10; nv <= 10000; nv *= 10)
        {

            ulong *v, *ref;
            int iref;

            iref = (bits == 10 && nv <= 1000) ? 0 : 2;

            ref = flint_malloc(nv * sizeof(ulong));
            v = flint_malloc(nv * sizeof(ulong));

            for (iter = 0; iter < 10; iter++)
            {

                int k;
                ulong p, a, va, na;
                nmod_t mod, order;

                p = n_randprime(state, bits, 0);
                a = n_primitive_root_prime(p);

                nmod_init(&mod, p);
                va = 1; na = p - 1;
                nmod_init(&order, na);

                dlog_vec_fill(ref, nv, 0);
                (func[iref])(ref, nv, a, va, mod, na, order);

                /* compare */
                for (f = iref + 1; f < nf; f++)
                {
                    dlog_vec_fill(v, nv, 0);
                    (func[f])(v, nv, a, va, mod, na, order);

                    if ((k = dlog_vec_diff(v, ref, nv)))
                    {
                        flint_printf("FAIL: log(%wu,%wu) mod %wu: %s->%w != %s->%w\n",
                                k, a, p, n[iref], ref[k], n[f], v[k]);
                        abort();
                    }
                }

            }

            flint_free(ref);
            flint_free(v);
        }

    }
    flint_randclear(state);
    flint_cleanup();
    flint_printf("PASS\n");
    return EXIT_SUCCESS;
}
コード例 #21
0
void
dirichlet_subgroup_init(dirichlet_group_t H, const dirichlet_group_t G, ulong h)
{
    int s[15];    /* selected components */
    slong k, j, e2;

    H->q = h;
    nmod_init(&H->mod, h);

    /* even components */

    e2 = n_remove(&h, 2);
    H->q_even = 1 << e2;

    s[0] = s[1] = 0;
    j = 0;
    if (e2 >= 2)
        s[j++] = 2;
    if (e2 >= 3)
        s[j++] = e2;

    H->neven = j;

    /* odd components */
    for (k = G->neven; k < G->num; k++)
    {
        ulong p = G->P[k].p;

        s[k] = n_remove(&h, p);

        if (s[k] > 0)
        {
            j++;
            H->rad_q *= p;
        }
    }

    H->num = j;
    H->P = flint_malloc(j * sizeof(dirichlet_prime_group_struct));
    H->generators = flint_malloc(j * sizeof(ulong));
    H->PHI = flint_malloc(j * sizeof(ulong));

    j = 0;
    for (k = 0; k < H->neven; k++)
    {
            H->P[j] = G->P[k];
            if (H->q_even < G->q_even)
            {
                nmod_init(&H->P[j].pe, H->q_even);
                H->P[j].e = s[k];
                if (k == 0)
                    H->P[j].g = H->q_even - 1;
                else
                    nmod_init(&H->P[j].phi, H->q_even / 4);
            }
            j++;
    }

    for (k = G->neven; k < G->num; k++)
    {
        if (s[k])
        {
            H->P[j] = G->P[k];
            if (s[k] < G->P[k].e)
            {
                ulong pf, p = H->P[j].p;
                H->P[j].e = s[k];
                pf = n_pow(p, s[k]);
                nmod_init(&H->P[j].pe, pf);
                nmod_init(&H->P[j].phi, (p-1) * pf / p);
            }
            j++;
        }
    }

    dirichlet_group_lift_generators(H);
}
コード例 #22
0
int main()
{
    slong iter;
    flint_rand_t state;

    flint_printf("dlog....");
    fflush(stdout);
    flint_randinit(state);

    for (iter = 0; iter < 1000; iter++)
    {
        dlog_table_t table;
        dlog_bsgs_t bsgs;
        dlog_crt_t crt;
        dlog_precomp_t pre1, pre100;
        ulong p, a, k;
        nmod_t modp;

        if (iter < 10)
            p = n_nth_prime(iter + 2);
        else
            p = n_randprime(state, 15, 0);
        nmod_init(&modp, p);

        a = n_primitive_root_prime(p);

        dlog_table_init(table, a, p);
        dlog_bsgs_init(bsgs, a, p, p-1, dlog_bsgs_size(p, 1));
        dlog_crt_init(crt, a, p, p-1, 10);
        dlog_precomp_n_init(pre1, a, p, p-1, 1);
        dlog_precomp_n_init(pre100, a, p, p-1, 100);

        for (k = 1; k < 100 && k < p; k++)
        {
            ulong l0, l1, l2, l3, l4, l5;

            l1 = dlog_table(table, k);
            l2 = dlog_bsgs(bsgs, k);
            l3 = dlog_crt(crt, k);
            l4 = dlog_precomp(pre1, k);
            l5 = dlog_precomp(pre100, k);
            
            if (iter < 50 && k <= 7)
                l0 = dlog_once(k, a, modp, p-1);
            else
                l0 = l1;

            if (l0 != l1 || l1 != l2 || l1 != l3 || l1 != l4 || l1 != l5)
            {
                flint_printf("\n\nFAIL: log(%wu,%wu) mod %wu\n\n",k,a,p);
                flint_printf("once: %wu\ntable: %wu\nbsgs: %wu\ncrt: %wu\nprecomp1: %wu\nprecomp100: %wu\n\n",
                        l0, l1, l2, l3, l4, l5);
                abort();
            }
        }
        dlog_table_clear(table);
        dlog_bsgs_clear(bsgs);
        dlog_crt_clear(crt);
        dlog_precomp_clear(pre1);
        dlog_precomp_clear(pre100);
    }

    flint_randclear(state);
    flint_cleanup();
    flint_printf("PASS\n");
    return EXIT_SUCCESS;
}