Help:=proc(): print(`F(n,K), Fs(n,K), FnK(n,K), RP(x,d,K), RC(x,d,K,n) `): print(`EvalC(L,x,x0), EvalCm(L,x,x0,K), EvalCD(L,x,x0), EvalCDm(L,x,x0,K), EvalCs(L,x,x0), `): print(` EvalCsm(L,x,x0,K), EvalCDs(L,x,x0) , EvalCDm(L,x,x0,K) `): end: Fs:=proc(n,K) : if n=0 or n=1 then 1: else Fs(n-1,K)+Fs(n-2,K) mod K: fi: end: F:=proc(n,K) option remember: if n=0 or n=1 then 1: else F(n-1,K)+F(n-2,K) mod K: fi: end: FnK:=proc(n,K) local i,P: P:=[0,1]: for i from 1 to n do P:=[P[2],P[1]+P[2] mod K]: od: P[2]: end: #RP(x,d,K): random polynomial in x of degree K with integer coefficient from -K to K RP:=proc(x,d,K) local i,ra: ra:=rand(-K..K): x^d+add(ra()*x^i,i=0..d-1): end: #RC(x,d,K,n): random chain of length n RC:=proc(x,d,K,n) local i: [seq(RP(x,d,K),i=1..n)]: end: #EvalC(L,x,x0): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs L[n](L[n-1](...L[1](x0)) EvalC:=proc(L,x,x0) local n: n:=nops(L): if n=1 then RETURN(subs(x=x0,L[1])): else subs(x=EvalC([op(1..n-1,L)],x,x0),L[n]): fi: end: #EvalCm(L,x,x0,K): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs L[n](L[n-1](...L[1](x0)) mod K EvalCm:=proc(L,x,x0,K) local n: n:=nops(L): if n=1 then RETURN(subs(x=x0,L[1])mod K): else subs(x=EvalCm([op(1..n-1,L)],x,x0,K),L[n]) mod K: fi: end: #EvalCD(L,x,x0): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs the derivative of L[n](L[n-1](...L[1](x)) at x=x0 EvalCD:=proc(L,x,x0) local n: n:=nops(L): if n=1 then subs(x=x0,diff(L[1],x)): else subs(x=EvalC([op(1..n-1,L)],x,x0),diff(L[n],x))*EvalCD([op(1..n-1,L)],x,x0) : fi: end: #EvalCDm(L,x,x0,K): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs the derivative of L[n](L[n-1](...L[1](x)) at x=x0 EvalCDm:=proc(L,x,x0,K) local n: n:=nops(L): if n=1 then subs(x=x0,diff(L[1],x) mod K): else subs(x=EvalCm([op(1..n-1,L)],x,x0,K),diff(L[n],x))*EvalCDm([op(1..n-1,L)],x,x0,K) mod K : fi: end: #EvalCs(L,x,x0): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs L[n](L[n-1](...L[1](x0)) the direct way EvalCs:=proc(L,x,x0) local a,i: a:=subs(x=x0,L[1]): for i from 2 to nops(L) do a:=subs(x=a,L[i]): od: a: end: #EvalCsm(L,x,x0,K): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs L[n](L[n-1](...L[1](x0)) the direct way EvalCsm:=proc(L,x,x0,K) local a,i: a:=subs(x=x0,L[1]) mod K: for i from 2 to nops(L) do a:=subs(x=a,L[i]) mod K: od: a: end: #EvalCDs(L,x,x0): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs L[n](L[n-1](...L[1](x0)) the direct way EvalCDs:=proc(L,x,x0) local a,i,b: a:=subs(x=x0,L[1]): b:=subs(x=x0,diff(L[1],x)): for i from 2 to nops(L) do b:=b*subs(x=a,diff(L[i],x)): a:=subs(x=a,L[i]): od: b: end: #EvalCDsm(L,x,x0,K): inputs a list of expressions, L, in the variable x, an initial number x0 #outputs L[n](L[n-1](...L[1](x0)) the direct way EvalCDsm:=proc(L,x,x0,K) local a,i,b: a:=subs(x=x0,L[1]) mod K: b:=subs(x=x0,diff(L[1],x)) mod K: for i from 2 to nops(L) do b:=b*subs(x=a,diff(L[i],x)) mod K: a:=subs(x=a,L[i]) mod K: od: b: end: