# Behavior of PossibleZeroQ

I was slightly surprised by the following result:

PossibleZeroQ[Gamma[a + b]/Gamma[a] - Pochhammer[a, b]]
(* Out: False *)


versus

PossibleZeroQ[Gamma[a + b]/Gamma[a] - Pochhammer[a, b] // FunctionExpand]
(* Out: True  *)


I had the wrong impression (maybe from the name) that PossibleZeroQ would be more likely to err by giving false positives than false negatives. I would think that numerical tests would indeed confirm that these expressions are the same. I guess the problem comes from the poles/zero's of the Gamma function. Or should I really be careful with FunctionExpand and does it really give possibly false results?

P.S. I came across this in a more practical situation where the equality of two expressions was not easy to see by hand, but simplified it to this core oddity.

• Note that Gamma[a + b]/Gamma[a] - Pochhammer[a, b] // FunctionExpand evaluates to 0 before being passed to PossibleZeroQ. So we can probably infer that PossibleZeroQ does not use FunctionExpand (or FullSimplify, which also gives 0 but is mentioned in the docs as being more rigorous). -- It would be nice to get an answer to how PossibleZeroQ works, but it might be that its internal workings are known only to WRI. Jun 14 '17 at 14:10
• Related: (65624) Jun 14 '17 at 14:10
• #[Gamma[a + b]/Gamma[a] - Pochhammer[a, b]] & /@ {FullSimplify, FunctionExpand} evaluates to {0, 0}. Note that the Possible Issues section of the documentation for FullSimplify states "Some of the transformations used by FullSimplify are only generically correct". Similarly, the Possible Issues section of the documentation for FunctionExpand states "Some transformations used by FunctionExpand are only generically valid". In this case the transformations are not valid when a is a nonpositive integer. Jun 14 '17 at 15:05
• This made me wonder about using FindInstance--it doesn't seem like it should be that hard for FindInstance to find values at which the two are not the same. E.g., {Gamma[a + b]/Gamma[a], Pochhammer[a, b]} /. {a -> -2, b -> -3} => {Indeterminate,-(1/60)}. Yet even if I tell it to just search the integers (FindInstance[Gamma[a + b]/Gamma[a] != Pochhammer[a, b], {a, b}, Integers]), it comes up empty: "The methods available to FindInstance are insufficient to find the requested instances or prove they do not exist." [continued....] Aug 7 '18 at 3:48
• Interestingly, if I instead try FindInstance[Gamma[a + b]/Gamma[a] != Pochhammer[a, b] && a < 0 && b < 0, {a, b}], I get a different warning message ["FindInstance used FunctionExpand to transform the system. Since FunctionExpand transformation rules are only generically correct, the solution set might have been altered."]. If FunctionExpand (which makes the two expressions the same: FunctionExpand[Pochhammer[a, b]] => Gamma[a + b]/Gamma[a]) was also operating within the uses of FindInstance in the previous comment, it could explain those results as well. Aug 7 '18 at 4:43