@@ -783,93 +783,26 @@ end
783783#
784784# ##############################################################################
785785
786- function evaluate (a:: UnivPoly{T} , A:: Vector{T} ) where {T <: RingElem }
787- R = base_ring (a)
786+ function evaluate (a:: UnivPoly , A:: Vector{<:Union{NCRingElem, RingElement}} )
787+ isempty (A) && error (" Too few values" )
788+ a2 = data (a)
789+ varidx = var_indices (a2)
790+ isempty (varidx) && return constant_coefficient (a2)
791+ vals = zeros (parent (A[1 ]), nvars (parent (a2)))
788792 n = length (A)
789- num = nvars (parent (data (a)))
790- if n > num
791- n > nvars (parent (a)) && error (" Too many values" )
792- if nvars (parent (data (a))) == 0
793- return constant_coefficient (data (a))* one (parent (A[1 ]))
794- end
795- return evaluate (data (a), A[1 : num])
796- end
797- if n < num
798- A = vcat (A, [zero (R) for i = 1 : num - n])
799- end
800- return evaluate (data (a), A)
801- end
802-
803- function evaluate (a:: UnivPoly{T} , A:: Vector{V} ) where {T <: RingElement , V <: Union{Integer, Rational, AbstractFloat} }
804- n = length (A)
805- num = nvars (parent (data (a)))
806- if n > num
807- n > nvars (parent (a)) && error (" Too many values" )
808- if nvars (parent (data (a))) == 0
809- return constant_coefficient (data (a))* one (parent (A[1 ]))
810- end
811- return evaluate (data (a), A[1 : num])
812- end
813- if n < num
814- A = vcat (A, zeros (V, num - n))
815- end
816- return evaluate (data (a), A)
817- end
818-
819- function evaluate (a:: UnivPoly{T} , A:: Vector{V} ) where {T <: RingElement , V <: RingElement }
820- n = length (A)
821- num = nvars (parent (data (a)))
822- if n > num
823- n > nvars (parent (a)) && error (" Too many values" )
824- if nvars (parent (data (a))) == 0
825- return constant_coefficient (data (a))* one (parent (A[1 ]))
826- end
827- return evaluate (data (a), A[1 : num])
793+ for i in varidx
794+ i <= n || error (" Number of variables does not match number of values" )
795+ vals[i] = A[i]
828796 end
829- if n < num
830- if n == 0
831- R = base_ring (a)
832- return evaluate (data (a), [zero (R) for _ in 1 : num])
833- else
834- R = parent (A[1 ])
835- A = vcat (A, [zero (R) for _ in 1 : num- n])
836- return evaluate (data (a), A)
837- end
838- end
839- return evaluate (data (a), A)
840- end
841-
842- function (a:: UnivPoly{T} )() where {T <: RingElement }
843- return evaluate (a, T[])
797+ return evaluate (a2, vals)
844798end
845799
846- function (a:: UnivPoly{T} )(vals:: T... ) where {T <: RingElement }
847- return evaluate (a, [vals... ])
848- end
849-
850- function (a:: UnivPoly{T} )(val:: V , vals:: V... ) where {T <: RingElement , V <: Union{Integer, Rational, AbstractFloat} }
800+ function (a:: UnivPoly )(val:: T , vals:: T... ) where T <: Union{NCRingElem, RingElement}
851801 return evaluate (a, [val, vals... ])
852802end
853803
854- function (a:: UnivPoly{T} )(vals:: NCRingElement... ) where {T <: RingElement }
855- A = [vals... ]
856- n = length (vals)
857- num = nvars (parent (data (a)))
858- if n > num
859- n > nvars (parent (a)) && error (" Too many values" )
860- if nvars (parent (data (a))) == 0
861- return constant_coefficient (data (a))* one (parent (A[1 ]))
862- end
863- return data (a)(vals[1 : num]. .. )
864- end
865- if n < num
866- A = vcat (A, zeros (Int, num - n))
867- end
868- return data (a)(A... )
869- end
870-
871- function evaluate (a:: UnivPoly{T} , vals:: Vector{V} ) where {T <: RingElement , V <: NCRingElem }
872- return a (vals... )
804+ function (a:: UnivPoly )()
805+ return evaluate (a, Int[])
873806end
874807
875808function evaluate (a:: UnivPoly{T} , vars:: Vector{Int} , vals:: Vector{V} ) where {T <: RingElement , V <: RingElement }
@@ -878,35 +811,21 @@ function evaluate(a::UnivPoly{T}, vars::Vector{Int}, vals::Vector{V}) where {T <
878811 vals2 = Vector {mpoly_type(T)} (undef, 0 )
879812 num = nvars (parent (data (a)))
880813 S = parent (a)
881- n = nvars (S )
814+ a2 = data ( S (a) )
882815 for i = 1 : length (vars)
883- vars[i] > n && error (" Unknown variable" )
884816 if vars[i] <= num
885817 push! (vars2, vars[i])
886818 push! (vals2, data (S (vals[i])))
887819 end
888820 end
889- return UnivPoly (evaluate (data ( S (a)) , vars2, vals2), S)
821+ return UnivPoly (evaluate (a2 , vars2, vals2), S)
890822end
891823
892824function evaluate (a:: S , vars:: Vector{S} , vals:: Vector{V} ) where {S <: UnivPoly{T} , V <: RingElement } where {T <: RingElement }
893825 varidx = Int[var_index (x) for x in vars]
894826 return evaluate (a, varidx, vals)
895827end
896828
897- function (a:: Union{MPolyRingElem, UniversalPolyRingElem} )(;kwargs... )
898- ss = symbols (parent (a))
899- vars = Array {Int} (undef, length (kwargs))
900- vals = Array {RingElement} (undef, length (kwargs))
901- for (i, (var, val)) in enumerate (kwargs)
902- vari = findfirst (isequal (var), ss)
903- vari === nothing && error (" Given polynomial has no variable $var " )
904- vars[i] = vari
905- vals[i] = val
906- end
907- return evaluate (a, vars, vals)
908- end
909-
910829# #######S,(a,b)=QQ[:a,:b]#######################################################################
911830#
912831# GCD
0 commit comments