Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
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);
 }
Exemplo n.º 3
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;
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
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;
}
Exemplo n.º 6
0
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;
}