# An example with non-unique pullbacks, genus 0 abc := [1/12, 1/6], [1/2]; f1 := -x*(1+x)*(3+4*x+4*x^2)^2; f2 := normal(subs(x = -x/(1+x), f1)); H1 := hypergeom(abc, f1); H2 := hypergeom(abc, f2); series(H1, x=0, 10) = series( (1+x)^(-1/2) * H2, x=0, 10); evalb(%); # Another example with non-unique pullbacks, genus 0 abc := [1/40, 11/40], [4/5]; f1 := 256*x*(1-x)^5/(25-44*x+20*x^2); f2 := normal(subs(x = -x/(1-44*x/25), f1)); H1 := hypergeom(abc, f1); H2 := hypergeom(abc, f2); series(H1, x=0, 10) = series( (1-44*x/25)^(-1/10) * H2, x=0, 10); evalb(%); # An example with non-unique pullbacks, genus 1 H := hypergeom([4/15, 13/30], [6/5], x); # has non-unique pullbacks in Q(x, w) where w := (25*x^3+14*x^2+25*x)^(1/2); f1 := 216/25/(x-5)^6 * ( (x^2+10*x+5)*(x^2+110*x+145) * w - (83*x^5+2485*x^4+10750*x^3+10250*x^2+8575*x+625) ); f2 := subs(w = -w, f1); # Both f1 and f2 go to zero when x -> infinity (replace x -> 1/x if # you want this at x = 0 like in the previous two examples). # Change of variables: chvar := proc(L, a) local i, f, x, Dx; Dx, x := op(_Envdiffopdomain); f := add(mult(subs(x = a, coeff(L, Dx, i)), Dx/diff(a, x)$i ), i = 0 .. degree(L, Dx)); sort(collect(f/lcoeff(f, Dx), Dx, factor), Dx); end: with(DEtools): _Envdiffopdomain := [Dx,x]: L := FindODE(H); L1 := chvar(L, f1): # large expression L1_normalized := collect(symmetric_product(L1, Dx - coeff(L1,Dx,1)/2), Dx, evala); # Solutions(L1_normalized) = "An algebraic prefactor" times Solutions(L1). L2 := chvar(L, f2): # Same as L1 after w -> -w. L2_normalized := collect(symmetric_product(L2, Dx - coeff(L2,Dx,1)/2), Dx, evala); evalb(L1_normalized = L2_normalized);