|
1129 | 1129 | return sols; |
1130 | 1130 | end proc: |
1131 | 1131 |
|
| 1132 | +ConstantSolveFamily:=proc(Equations, FamPositive, FamNotNull, Inequalities, Inequations) |
| 1133 | +local i; |
| 1134 | + for i from 1 to nops(Equations) do |
| 1135 | + if sign(Equations[i]) <> 0 then |
| 1136 | + return []; |
| 1137 | + end if; |
| 1138 | + end do; |
| 1139 | + for i from 1 to nops(FamPositive) do |
| 1140 | + if sign(FamPositive[i]) <= 0 then |
| 1141 | + return []; |
| 1142 | + end if; |
| 1143 | + end do; |
| 1144 | + for i from 1 to nops(Inequalities) do |
| 1145 | + if sign(Inequalities[i]) <= 0 then |
| 1146 | + return []; |
| 1147 | + end if; |
| 1148 | + end do; |
| 1149 | + for i from 1 to nops(FamNotNull) do |
| 1150 | + if sign(FamNotNull[i]) = 0 then |
| 1151 | + return []; |
| 1152 | + end if; |
| 1153 | + end do; |
| 1154 | + for i from 1 to nops(Inequations) do |
| 1155 | + if sign(Inequations[i]) = 0 then |
| 1156 | + return []; |
| 1157 | + end if; |
| 1158 | + end do; |
| 1159 | + return [[]]; |
| 1160 | +end proc: |
| 1161 | +
|
1132 | 1162 | UnivariateSolveFamily:=proc(Equations, Fam, Inequalities, Inequations, vars) |
1133 | 1163 | local g, upol, f, uroots, i, sq, sols, q, newpol, p, mid; |
1134 | 1164 | g:=0: |
|
1674 | 1704 | Fam:=[op(FamPositive), op(FamNotNull)]: |
1675 | 1705 | Fam:=sort(Fam, (a, b)->degree(a)<=degree(b)): |
1676 | 1706 | sols:=[]; |
| 1707 | + if nops(vars) = 0 then |
| 1708 | + return ConstantSolveFamily(Equations, FamPositive, FamNotNull, Inequalities, Inequations); |
| 1709 | + end if; |
1677 | 1710 | if nops(vars) = 1 then |
1678 | 1711 | return UnivariateSolveFamily(Equations, FamPositive, Inequalities, Inequations, vars); |
1679 | 1712 | end if; |
|
1858 | 1891 | SemiAlgebraicSolve:=proc(Equations, Inequalities, Inequations, opts:={}) |
1859 | 1892 | local newsols, _toStudy, l, i, pol, boo, vars, _Studied, singminors, pt, _c, |
1860 | 1893 | midsols, verb, sols, lsigns, _l, nc, isempty, oldvars, newvars, |
1861 | | -newopts, oldnewvars, npos; |
| 1894 | +newopts, oldnewvars, npos, NewEquations; |
1862 | 1895 |
|
1863 | 1896 | if type(subs(opts, "verb"), integer) then |
1864 | 1897 | verb:=subs(opts, "verb"); |
|
1872 | 1905 | isempty:=0: |
1873 | 1906 | end if; |
1874 | 1907 |
|
| 1908 | + if member(0, Inequations) or member(0, Inequalities) or |
| 1909 | + member(-1, map(sign, map(_pol->if degree(_pol)=0 then _pol fi, Inequalities))) then |
| 1910 | + return []; |
| 1911 | + end if; |
| 1912 | +
|
| 1913 | + if nops(select(_pol -> type(_pol, constant) and _pol <> 0, Equations)) > 0 then |
| 1914 | + return []; |
| 1915 | + end if; |
| 1916 | +
|
| 1917 | + NewEquations := select(_pol -> not type(_pol, constant), Equations); |
| 1918 | +
|
1875 | 1919 | vars:=[op(indets([op(Equations), op(Inequalities), op(Inequations)]))]; |
1876 | 1920 | sols := []; |
1877 | 1921 | lsigns:={}: |
1878 | | - if nops(Equations) > 0 then |
1879 | | - sols := PointsPerComponentsAlgebraic(Equations, Inequalities, Inequations, opts); |
| 1922 | + if nops(NewEquations) > 0 then |
| 1923 | + sols := PointsPerComponentsAlgebraic(NewEquations, Inequalities, Inequations, opts); |
1880 | 1924 | if isempty>=1 and nops(sols) > 0 then |
1881 | 1925 | return sols; |
1882 | 1926 | end if; |
|
1920 | 1964 | end if; |
1921 | 1965 | end if; |
1922 | 1966 |
|
1923 | | - newsols:=SemiAlgebraicSolveIterateOnFamilies(Equations, _toStudy, Inequalities, |
| 1967 | + newsols:=SemiAlgebraicSolveIterateOnFamilies(NewEquations, _toStudy, Inequalities, |
1924 | 1968 | Inequations, vars, newopts); |
1925 | 1969 |
|
1926 | 1970 | midsols:=map(pt->map(_c->lhs(_c)=(rhs(_c)[1]+rhs(_c)[2])/2, pt), newsols): |
|
1966 | 2010 | end if; |
1967 | 2011 | end if; |
1968 | 2012 |
|
1969 | | - newsols:=SemiAlgebraicSolveIterateOnFamilies(Equations, _toStudy, Inequalities, |
| 2013 | + newsols:=SemiAlgebraicSolveIterateOnFamilies(NewEquations, _toStudy, Inequalities, |
1970 | 2014 | Inequations, vars, newopts); |
1971 | 2015 | midsols:=map(pt->map(_c->lhs(_c)=(rhs(_c)[1]+rhs(_c)[2])/2, pt), newsols): |
1972 | 2016 | lsigns:=lsigns union convert(map(l->map(sign, l), map(pt->subs(pt,Inequations), midsols)), set): |
|
0 commit comments