Z3_ast Z3_API Z3_algebraic_root(Z3_context c, Z3_ast a, unsigned k) { Z3_TRY; LOG_Z3_algebraic_root(c, a, k); RESET_ERROR_CODE(); CHECK_IS_ALGEBRAIC_X(a, 0); if (k % 2 == 0) { if ((is_rational(c, a) && get_rational(c, a).is_neg()) || (!is_rational(c, a) && am(c).is_neg(get_irrational(c, a)))) { SET_ERROR_CODE(Z3_INVALID_ARG); RETURN_Z3(0); } } algebraic_numbers::manager & _am = am(c); scoped_anum _r(_am); if (is_rational(c, a)) { scoped_anum av(_am); _am.set(av, get_rational(c, a).to_mpq()); _am.root(av, k, _r); } else { algebraic_numbers::anum const & av = get_irrational(c, a); _am.root(av, k, _r); } expr * r = au(c).mk_numeral(_r, false); mk_c(c)->save_ast_trail(r); RETURN_Z3(of_ast(r)); Z3_CATCH_RETURN(0); }
Z3_ast Z3_API Z3_algebraic_div(Z3_context c, Z3_ast a, Z3_ast b) { Z3_TRY; LOG_Z3_algebraic_div(c, a, b); RESET_ERROR_CODE(); CHECK_IS_ALGEBRAIC_X(a, 0); CHECK_IS_ALGEBRAIC_X(b, 0); if ((is_rational(c, b) && get_rational(c, b).is_zero()) || (!is_rational(c, b) && am(c).is_zero(get_irrational(c, b)))) { SET_ERROR_CODE(Z3_INVALID_ARG); RETURN_Z3(0); } BIN_OP(/,div); Z3_CATCH_RETURN(0); }
static bool to_anum_vector(Z3_context c, unsigned n, Z3_ast a[], scoped_anum_vector & as) { algebraic_numbers::manager & _am = am(c); scoped_anum tmp(_am); for (unsigned i = 0; i < n; i++) { if (is_rational(c, a[i])) { _am.set(tmp, get_rational(c, a[i]).to_mpq()); as.push_back(tmp); } else if (is_irrational(c, a[i])) { as.push_back(get_irrational(c, a[i])); } else { return false; } } return true; }
int Z3_API Z3_algebraic_sign(Z3_context c, Z3_ast a) { Z3_TRY; LOG_Z3_algebraic_sign(c, a); RESET_ERROR_CODE(); CHECK_IS_ALGEBRAIC(a, 0); if (is_rational(c, a)) { rational v = get_rational(c, a); if (v.is_pos()) return 1; else if (v.is_neg()) return -1; else return 0; } else { algebraic_numbers::anum const & v = get_irrational(c, a); if (am(c).is_pos(v)) return 1; else if (am(c).is_neg(v)) return -1; else return 0; } Z3_CATCH_RETURN(0); }
matrix3_p koeffizienten_gamma_1dim(int grad) { int a, b, k, n, q; fepc_real_t ***g; matrix3_p back, matrix; fepc_real_t temp, wurzel, rat, reell; fepc_real_t *A, *B; ASSERT(grad >= 0); A = (fepc_real_t*) malloc(sizeof(fepc_real_t)*(3*grad+1)); ASSERT(A != NULL); B = (fepc_real_t*) malloc(sizeof(fepc_real_t)*(3*grad+1)); ASSERT(B != NULL); for (n=0;n<=3*grad;n++) { A[n] = sqrt(2*n+3)*sqrt(2*n+1)/(fepc_real_t)(n+1); } B[0] = 0.0; for (n=1;n<=3*grad;n++) { B[n] = (sqrt(2*n+3)/sqrt(2*n-1)) * ( (fepc_real_t)n/(fepc_real_t)(n+1) ); } matrix = matrix3_new(3*grad+1,3*grad+1,3*grad+1); g = matrix->a; for(b=0;b<=3*grad;b++) { for(k=0;k<=3*grad;k++) { g[0][b][k] = 0.0; } } for (k=1;k<=3*grad;k++) { temp = 2.0*sqrt( (2.0*k-1)*(2.0*k+1) ); g[0][k-1][k] = pow(-1,k)/temp; } for (k=1;k<=3*grad;k++) { g[0][k][k-1] = g[0][k-1][k]; } g[0][0][0] = 1.0/2.0; for(q=1;q<=3*grad;q++) { for(a=1;a<=q;a++) { for(b=0;b<=(q-a);b++) { k = q-a-b; if ( (a>b+k+1)||(b>a+k+1)||(k>a+b+1) ) { g[a][b][k] = 0.0; } if (b==0) { g[a][0][k] = pow(-1,a) * g[0][a][k]; } if (k==0) { g[a][b][0] = pow(-1,a) * g[0][b][a]; } if ( ((a>b+k+1)||(b>a+k+1)||(k>a+b+1)||(b==0)||(k==0)) == 0) { temp = A[a-1]*(g[a-1][b][k+1]/A[k] + g[a-1][b+1][k]/A[b] + g[a-1][b][k]); if (k>0) temp = temp + A[a-1]*B[k]*g[a-1][b][k-1]/A[k]; if (b>0) temp = temp + A[a-1]*B[b]*g[a-1][b-1][k]/A[b]; if (a>1) temp = temp - B[a-1]*g[a-2][b][k]; g[a][b][k] = temp; /*Korrektur der Werte (siehe Dokumentation)*/ wurzel = sqrt( (2*a+1)*(2*b+1)*(2*k+1) ); reell = temp; rat = reell*wurzel; rat = get_rational(rat,1e-14,10000); reell = rat/wurzel; g[a][b][k] = reell; } } } } back = matrix3_new(grad+1,grad+1,grad+1); for(a=0;a<=grad;a++) { for(b=0;b<=grad;b++) { for(k=0;k<=grad;k++) { back->a[a][b][k] = matrix->a[a][b][k]; } } } free(A); free(B); matrix3_del(matrix); return back; }
matrix_p koeffizienten_xi_1dim(int grad) { matrix_p back, matrix; int q, m, n; fepc_real_t **x; fepc_real_t *a, *b; fepc_real_t rat, reell, faktor, temp; ASSERT(grad >= 0); a = (fepc_real_t*) malloc(sizeof(fepc_real_t) * (2*grad + 1) ); ASSERT(a != NULL); b = (fepc_real_t*) malloc(sizeof(fepc_real_t) * (2*grad + 1) ); ASSERT(b != NULL); matrix = matrix_new( 2*grad+1, 2*grad+1 ); x = matrix->a; for (n=0;n<=2*grad;n++) { a[n] = sqrt(2*n+3)*sqrt(2*n+1)/(fepc_real_t)(n+1); } b[0] = 0.0; for (n=1;n<=2*grad;n++) { b[n] = (sqrt(2*n+3)/sqrt(2*n-1)) * ( (fepc_real_t)n/(fepc_real_t)(n+1) ); } x[0][0] = 1./sqrt(2); for (q=1;q<=2*grad;q++) { for (n=0;n<=q;n++) { m = q-n; if (n<m) { x[n][m] = 0.0; } else { temp = a[n-1]/2.0*(x[n-1][m+1]/a[m]+x[n-1][m]); if (m>0) { temp = temp + a[n-1]/2.0*b[m]/a[m]*x[n-1][m-1]; } if (n>=2) { temp = temp - b[n-1]*x[n-2][m]; } /*Korrektur der Werte (siehe Dokumentation)*/ faktor = pow(2,((fepc_real_t)n+0.5))/sqrt( (2*n+1)*(2*m+1) ); reell = temp; rat = reell*faktor; rat = get_rational(rat,1e-14,10000); reell = rat/faktor; x[n][m] = reell; } } } back = matrix_new(grad+1,grad+1); for (m=0;m<=grad;m++) { for (n=0;n<=grad;n++) { back->a[m][n] = matrix->a[m][n]; } } free(a); free(b); matrix_del(matrix); return back; }