void test_regex_boundary(void) { mpc_parser_t *re0, *re1, *re2; re0 = mpc_re("\\bfoo\\b"); re1 = mpc_re("(w| )?\\bfoo\\b"); re2 = mpc_re("py\\B.*"); PT_ASSERT(regex_test_pass(re0, "foo", "foo")); PT_ASSERT(regex_test_pass(re0, "foo.", "foo")); PT_ASSERT(regex_test_pass(re0, "foo)", "foo")); PT_ASSERT(regex_test_pass(re0, "foo baz", "foo")); PT_ASSERT(regex_test_fail(re0, "foobar", "foo")); PT_ASSERT(regex_test_fail(re0, "foo3", "foo")); PT_ASSERT(regex_test_pass(re1, "foo", "foo")); PT_ASSERT(regex_test_pass(re1, " foo", " foo")); PT_ASSERT(regex_test_fail(re1, "wfoo", "foo")); PT_ASSERT(regex_test_pass(re2, "python", "python")); PT_ASSERT(regex_test_pass(re2, "py3", "py3")); PT_ASSERT(regex_test_pass(re2, "py2", "py2")); PT_ASSERT(regex_test_fail(re2, "py", "py")); PT_ASSERT(regex_test_fail(re2, "py.", "py.")); PT_ASSERT(regex_test_fail(re2, "py!", "py!")); mpc_delete(re0); mpc_delete(re1); mpc_delete(re2); }
void test_regex_range(void) { mpc_parser_t *re0, *re1, *re2, *re3; re0 = mpc_re("abg[abcdef]"); re1 = mpc_re("y*[a-z]"); re2 = mpc_re("zz(p+)?[A-Z_0\\]123]*"); re3 = mpc_re("^[^56hy].*$"); /* TODO: Testing */ mpc_delete(re0); mpc_delete(re1); mpc_delete(re2); mpc_delete(re3); }
// Computes q = exp(2 pi i tau). static void compute_q(mpc_t q, mpc_t tau) { mpc_t z0; mpf_t f0, f1; mpf_ptr fp0; pbc_mpui pwr; mpc_init(z0); mpf_init(f0); mpf_init(f1); //compute z0 = 2 pi i tau mpc_set(z0, tau); //first remove integral part of Re(tau) //since exp(2 pi i) = 1 //it seems |Re(tau)| < 1 anyway? fp0 = mpc_re(z0); mpf_trunc(f1, fp0); mpf_sub(fp0, fp0, f1); mpc_mul_mpf(z0, z0, pi); mpc_mul_ui(z0, z0, 2); mpc_muli(z0, z0); //compute q = exp(z0); //first write z0 = A + a + b i //where A is a (negative) integer //and a, b are in [-1, 1] //compute e^A separately fp0 = mpc_re(z0); pwr = mpf_get_ui(fp0); mpf_pow_ui(f0, recipeulere, pwr); mpf_add_ui(fp0, fp0, pwr); mpf_exp(f1, mpc_re(z0)); mpf_mul(f0, f1, f0); mpc_cis(q, mpc_im(z0)); /* old_mpc_exp(q, z0); */ mpc_mul_mpf(q, q, f0); mpc_clear(z0); mpf_clear(f0); mpf_clear(f1); }
void test_regex_lisp_comment(void) { mpc_parser_t *re0 = mpc_re(";[^\\n\\r]*"); PT_ASSERT(regex_test_pass(re0, ";comment", ";comment")); PT_ASSERT(regex_test_pass(re0, ";i am the\nman", ";i am the")); mpc_delete(re0); }
void test_regex_string(void) { mpc_parser_t *re0 = mpc_re("\"(\\\\.|[^\"])*\""); PT_ASSERT(regex_test_pass(re0, "\"there\"", "\"there\"")); PT_ASSERT(regex_test_pass(re0, "\"hello\"", "\"hello\"")); PT_ASSERT(regex_test_pass(re0, "\"i am dan\"", "\"i am dan\"")); PT_ASSERT(regex_test_pass(re0, "\"i a\\\"m dan\"", "\"i a\\\"m dan\"")); mpc_delete(re0); }
void test_regex_basic(void) { mpc_parser_t *re0, *re1, *re2, *re3, *re4, *re5; re0 = mpc_re("abc|bcd"); re1 = mpc_re("abc|bcd|e"); re2 = mpc_re("ab()c(ab)*"); re3 = mpc_re("abc(abdd)?"); re4 = mpc_re("ab|c(abdd)?"); re5 = mpc_re("abc(ab|dd)+g$"); PT_ASSERT(regex_test_pass(re0, "abc", "abc")); PT_ASSERT(regex_test_pass(re0, "bcd", "bcd")); PT_ASSERT(regex_test_fail(re0, "bc", "bc")); PT_ASSERT(regex_test_fail(re0, "ab", "ab")); PT_ASSERT(regex_test_pass(re1, "e", "e")); PT_ASSERT(regex_test_pass(re2, "abc", "abc")); PT_ASSERT(regex_test_pass(re2, "abcabab", "abcabab")); PT_ASSERT(regex_test_pass(re2, "abcababd", "abcabab")); PT_ASSERT(regex_test_pass(re5, "abcddg", "abcddg")); mpc_delete(re0); mpc_delete(re1); mpc_delete(re2); mpc_delete(re3); mpc_delete(re4); mpc_delete(re5); }
static void mpc_cis(mpc_t res, mpf_t theta) { mpf_t a; mpf_init(a); mpf_set(a, theta); //res = exp(i a) // = cos a + i sin a //converges quickly near the origin mpf_t f0; mpf_ptr rx = mpc_re(res), ry = mpc_im(res); int i; int toggle = 1; mpf_init(f0); mpf_set(f0, a); mpf_set_ui(rx, 1); mpf_set(ry, f0); i = 1; for(;;) { toggle = !toggle; i++; mpf_div_ui(f0, f0, i); mpf_mul(f0, f0, a); if (toggle) { mpf_add(rx, rx, f0); } else { mpf_sub(rx, rx, f0); } i++; mpf_div_ui(f0, f0, i); mpf_mul(f0, f0, a); if (toggle) { mpf_add(ry, ry, f0); } else { mpf_sub(ry, ry, f0); } if (mpf_sgn(f0) > 0) { if (mpf_cmp(f0, epsilon) < 0) break; } else { if (mpf_cmp(f0, negepsilon) > 0) break; } } mpf_clear(f0); mpf_clear(a); }
// See Cohen; my D is -D in his notation. size_t pbc_hilbert(mpz_t **arr, int D) { int a, b; int t; int B = (int)floor(sqrt((double) D / 3.0)); mpc_t alpha; mpc_t j; mpf_t sqrtD; mpf_t f0; darray_t Pz; mpc_t z0, z1, z2; double d = 1.0; int h = 1; int jcount = 1; // Compute required precision. b = D % 2; for (;;) { t = (b*b + D) / 4; a = b; if (a <= 1) { a = 1; goto step535_4; } step535_3: if (!(t % a)) { jcount++; if ((a == b) || (a*a == t) || !b) { d += 1.0 / ((double) a); h++; } else { d += 2.0 / ((double) a); h+=2; } } step535_4: a++; if (a * a <= t) { goto step535_3; } else { b += 2; if (b > B) break; } } //printf("modulus: %f\n", exp(3.14159265358979 * sqrt(D)) * d * 0.5); d *= sqrt(D) * 3.14159265358979 / log(2); precision_init((int)(d + 34)); pbc_info("class number %d, %d bit precision", h, (int) d + 34); darray_init(Pz); mpc_init(alpha); mpc_init(j); mpc_init(z0); mpc_init(z1); mpc_init(z2); mpf_init(sqrtD); mpf_init(f0); mpf_sqrt_ui(sqrtD, D); b = D % 2; h = 0; for (;;) { t = (b*b + D) / 4; if (b > 1) { a = b; } else { a = 1; } step3: if (t % a) { step4: a++; if (a * a <= t) goto step3; } else { // a, b, t/a are coeffs of an appropriate primitive reduced positive // definite form. // Compute j((-b + sqrt{-D})/(2a)). h++; pbc_info("[%d/%d] a b c = %d %d %d", h, jcount, a, b, t/a); mpf_set_ui(f0, 1); mpf_div_ui(f0, f0, 2 * a); mpf_mul(mpc_im(alpha), sqrtD, f0); mpf_mul_ui(f0, f0, b); mpf_neg(mpc_re(alpha), f0); compute_j(j, alpha); if (0) { int i; for (i=Pz->count - 1; i>=0; i--) { printf("P %d = ", i); mpc_out_str(stdout, 10, 4, Pz->item[i]); printf("\n"); } } if (a == b || a * a == t || !b) { // P *= X - j int i, n; mpc_ptr p0; p0 = (mpc_ptr) pbc_malloc(sizeof(mpc_t)); mpc_init(p0); mpc_neg(p0, j); n = Pz->count; if (n) { mpc_set(z1, Pz->item[0]); mpc_add(Pz->item[0], z1, p0); for (i=1; i<n; i++) { mpc_mul(z0, z1, p0); mpc_set(z1, Pz->item[i]); mpc_add(Pz->item[i], z1, z0); } mpc_mul(p0, p0, z1); } darray_append(Pz, p0); } else { // P *= X^2 - 2 Re(j) X + |j|^2 int i, n; mpc_ptr p0, p1; p0 = (mpc_ptr) pbc_malloc(sizeof(mpc_t)); p1 = (mpc_ptr) pbc_malloc(sizeof(mpc_t)); mpc_init(p0); mpc_init(p1); // p1 = - 2 Re(j) mpf_mul_ui(f0, mpc_re(j), 2); mpf_neg(f0, f0); mpf_set(mpc_re(p1), f0); // p0 = |j|^2 mpf_mul(f0, mpc_re(j), mpc_re(j)); mpf_mul(mpc_re(p0), mpc_im(j), mpc_im(j)); mpf_add(mpc_re(p0), mpc_re(p0), f0); n = Pz->count; if (!n) { } else if (n == 1) { mpc_set(z1, Pz->item[0]); mpc_add(Pz->item[0], z1, p1); mpc_mul(p1, z1, p1); mpc_add(p1, p1, p0); mpc_mul(p0, p0, z1); } else { mpc_set(z2, Pz->item[0]); mpc_set(z1, Pz->item[1]); mpc_add(Pz->item[0], z2, p1); mpc_mul(z0, z2, p1); mpc_add(Pz->item[1], z1, z0); mpc_add(Pz->item[1], Pz->item[1], p0); for (i=2; i<n; i++) { mpc_mul(z0, z1, p1); mpc_mul(alpha, z2, p0); mpc_set(z2, z1); mpc_set(z1, Pz->item[i]); mpc_add(alpha, alpha, z0); mpc_add(Pz->item[i], z1, alpha); } mpc_mul(z0, z2, p0); mpc_mul(p1, p1, z1); mpc_add(p1, p1, z0); mpc_mul(p0, p0, z1); } darray_append(Pz, p1); darray_append(Pz, p0); } goto step4; } b+=2; if (b > B) break; } // Round polynomial and assign. int k = 0; { *arr = pbc_malloc(sizeof(mpz_t) * (Pz->count + 1)); int i; for (i=Pz->count - 1; i>=0; i--) { if (mpf_sgn(mpc_re(Pz->item[i])) < 0) { mpf_set_d(f0, -0.5); } else { mpf_set_d(f0, 0.5); } mpf_add(f0, f0, mpc_re(Pz->item[i])); mpz_init((*arr)[k]); mpz_set_f((*arr)[k], f0); k++; mpc_clear(Pz->item[i]); pbc_free(Pz->item[i]); } mpz_init((*arr)[k]); mpz_set_ui((*arr)[k], 1); k++; } darray_clear(Pz); mpc_clear(z0); mpc_clear(z1); mpc_clear(z2); mpf_clear(f0); mpf_clear(sqrtD); mpc_clear(alpha); mpc_clear(j); precision_clear(); return k; }