Karim Belabas on Sun, 17 Jun 2018 11:17:16 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Rational functions equal almost everywhere, but not for "subst" |
* Jacques Gélinas [2018-06-17 06:49]: > A perplexing (bad) use of global variables. > > g1(r,R) = R / (2*r+1 - R); > g2(r,R) = a + r; > F(r,a,b,R) = g1(r,a*b*R) / g1(r-1,a*R) * g2(r,a*b*R) / g2(r-1,a*b*R) ; > G(r,a,b,R) = b * (2*r-1-a*R) / (2*r+1-a*b*R) * g2(r,a*b*R) / g2(r-1,a*b*R) ; > G(r,a,b,R) == F(r,a,b,R) \\ identical ! > 1 > G(r,0,b,R) == subst(F(r,a,b,R),a,0) \\ not equal ??? (:-( > 0 Please have a look at '?? my'. Then instrument g2 as follows: g2(r,R) = print(a); a + r; and observe (10:57) gp > G(r,a,b,R) == F(r,a,b,R) a a a a %6 = 1 (10:57) gp > G(r,0,b,R) == subst(F(r,a,b,R),a,0) a a a a %7 = 0 When you write G(r,0,b,R), - the variable 'a' which is a parameter of the function G, lexically scoped to the body of G, is set to 0, - but the *other* variable 'a' with global scope is unaffected (it happens to share the same name in your program but is otherwise unrelated to the one set to 0) and this is the one seen by g2. The behaviour is indeed different in 2.3-stable (and in the first development releases 2.4.*). It changed in 2.5-stable when lexically scoped variables and the my() operator were introduced: - in stable versions up to 2.3.0 function parameters were *dynamically* scoped (as per local()) and were indeed 'semi-global': later references from anywhere in the program accessed the new value until the function returned; [ this is what you expected ] - from 2.5.0 on they are lexically scoped (as per my()). This change of behaviour was highlighted in the release notes for pari-2.5 https://pari.math.u-bordeaux.fr/archives/pari-announce-11/msg00001.html [...] MAIN BACKWARD COMPATIBILITY ISSUES: see the 'COMPAT' file for the full list. =================================== - The main issue with existing GP scripts has to do with the scope of private variables (my vs. local), see section 2.6 in User's Manual. Indeed, variables implicitly scoped to loop or function bodies are now lexically scoped. From GP-2.5 on, in constructs like for(i = 1, 10, g()) f(i) = g() the index i is truly local to the loop/function body. It is no longer seen by the function g(), as used to be the case in GP-2.3. [...] Cheers, K.B. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 21 23 351, cours de la Liberation http://www.math.u-bordeaux.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP] `