@@ -1177,6 +1177,14 @@ void lp_polynomial_roots_isolate(const lp_polynomial_t* A, const lp_assignment_t
11771177 lp_value_construct_none (& x_value_backup );
11781178 }
11791179
1180+ lp_polynomial_t B ;
1181+ lp_polynomial_construct (& B , A -> ctx );
1182+
1183+ lp_integer_t multiplier ;
1184+ integer_construct (& multiplier );
1185+ coefficient_evaluate_rationals (A -> ctx , & A -> data , M , & B .data , & multiplier );
1186+ integer_destruct (& multiplier );
1187+
11801188 size_t i ;
11811189
11821190 lp_polynomial_t * * factors = 0 ;
@@ -1190,11 +1198,12 @@ void lp_polynomial_roots_isolate(const lp_polynomial_t* A, const lp_assignment_t
11901198 // Get the reduced polynomial
11911199 lp_polynomial_t A_r ;
11921200 lp_polynomial_construct (& A_r , A -> ctx );
1193- lp_polynomial_reductum_m (& A_r , A , M );
1194- assert (x == lp_polynomial_top_variable (A ));
1195-
1196- // Get the square-free factorization
1197- lp_polynomial_factor_square_free (& A_r , & factors , & multiplicities , & factors_size );
1201+ if (x == lp_polynomial_top_variable (& B )) {
1202+ lp_polynomial_reductum_m (& A_r , & B , M );
1203+ assert (x == lp_polynomial_top_variable (& B ));
1204+ // Get the square-free factorization
1205+ lp_polynomial_factor_square_free (& A_r , & factors , & multiplicities , & factors_size );
1206+ }
11981207
11991208 // Count the max number of roots
12001209 size_t total_degree = 0 ;
@@ -1297,6 +1306,7 @@ void lp_polynomial_roots_isolate(const lp_polynomial_t* A, const lp_assignment_t
12971306 free (roots_tmp );
12981307 lp_value_destruct (& x_value_backup );
12991308 lp_polynomial_destruct (& A_r );
1309+ lp_polynomial_destruct (& B );
13001310}
13011311
13021312lp_feasibility_set_t * lp_polynomial_constraint_get_feasible_set (const lp_polynomial_t * A , lp_sign_condition_t sgn_condition , int negated , const lp_assignment_t * M ) {
@@ -2134,6 +2144,29 @@ int lp_polynomial_constraint_evaluate(const lp_polynomial_t* A, lp_sign_conditio
21342144 return lp_sign_condition_consistent (sgn_condition , p_sign );
21352145}
21362146
2147+ int lp_polynomial_constraint_evaluate_subs (const lp_polynomial_t * A , lp_sign_condition_t sgn_condition , const lp_assignment_t * M ) {
2148+ coefficient_t A_rat ;
2149+ lp_integer_t multiplier ;
2150+
2151+ lp_polynomial_external_clean (A );
2152+ assert (A -> ctx -> K == lp_Z );
2153+
2154+ integer_construct (& multiplier );
2155+ coefficient_construct (A -> ctx , & A_rat );
2156+ coefficient_evaluate_rationals (A -> ctx , & A -> data , M , & A_rat , & multiplier );
2157+ integer_destruct (& multiplier );
2158+
2159+ int res = -1 ;
2160+ if (A_rat .type == COEFFICIENT_NUMERIC ) {
2161+ int sgn = integer_sgn (lp_Z , & A_rat .value .num );
2162+ res = lp_sign_condition_consistent (sgn_condition , sgn );
2163+ assert (res >= 0 );
2164+ }
2165+
2166+ coefficient_destruct (& A_rat );
2167+ return res ;
2168+ }
2169+
21372170int lp_polynomial_constraint_evaluate_Zp (const lp_polynomial_t * A , lp_sign_condition_t sgn_condition , const lp_assignment_t * m ) {
21382171
21392172 lp_polynomial_external_clean (A );
0 commit comments