DEFINE PTR="CARD" DEFINE ENTRY_SIZE="3" TYPE TRIPLE=[BYTE a,b,c] TYPE TRIPLES=[ PTR buf ;BYTE ARRAY BYTE count] PTR FUNC GetItemAddr(TRIPLES POINTER arr BYTE index) PTR addr addr=arr.buf+index*ENTRY_SIZE RETURN (addr) PROC PrintTriples(TRIPLES POINTER arr) INT i TRIPLE POINTER t FOR i=0 TO arr.count-1 DO t=GetItemAddr(arr,i) PrintF("(%B %B %B) ",t.a,t.b,t.c) OD RETURN PROC Init(TRIPLES POINTER arr BYTE ARRAY b) arr.buf=b arr.count=0 RETURN PROC AddItem(TRIPLES POINTER arr TRIPLE POINTER t) TRIPLE POINTER p p=GetItemAddr(arr,arr.count) p.a=t.a p.b=t.b p.c=t.c arr.count==+1 RETURN PROC FindTriples(TRIPLES POINTER res BYTE limit) BYTE ARRAY data(100) BYTE half,i,j,k TRIPLE t Init(res,data) half=limit/2 FOR i=1 TO half DO FOR j=i TO half DO FOR k=j TO limit DO IF i+j+k1 THEN RETURN (0) FI IF Gcd(t.b,t.c)>1 THEN RETURN (0) FI IF Gcd(t.a,t.c)>1 THEN RETURN (0) FI RETURN (1) PROC FindPrimitives(TRIPLES POINTER arr,res) BYTE ARRAY data(100) INT i TRIPLE POINTER t Init(res,data) FOR i=0 TO arr.count-1 DO t=GetItemAddr(arr,i) IF IsPrimitive(t) THEN AddItem(res,t) FI OD RETURN PROC Main() DEFINE LIMIT="100" TRIPLES res,res2 FindTriples(res,LIMIT) PrintF("There are %B pythagorean triples with a perimeter less than %B:%E%E",res.count,LIMIT) PrintTriples(res) FindPrimitives(res,res2) PrintF("%E%E%E%B of them are primitive:%E%E",res2.count) PrintTriples(res2) RETURN