/* Function that returns a pythagorean triple from two parameters */ pythag(u,v):=[u^2-v^2,2*u*v,u^2+v^2]$ /* Predicate function to check for primitivity */ primitivep(lst):=if lreduce('gcd,lst)=1 then true$ /* Function that returns perimeter */ perim(lst):=apply("+",lst)$ /* Function to return a list of triples by parameter u */ /* Parameter v is controlled to be lesser or equal than u, and when equal are deleted */ param_pythag(n):=block( create_list(lambda([x,y],pythag(x,y) and x#y)(i,j),i,1,n,j,1,i), delete(false,%%))$ /* Test case */ /* With the function param_pythag as it is some non primitive triples are missing, but not the primitives */ sublist(param_pythag(6),lambda([x],primitivep(x) and perim(x)<=100)); /* The number of triples, primitive or not, can be recovered from the primitives */ block( apply(append,makelist(%*i,i,1,8)), sublist(%%,lambda([x],perim(x)<=100)));