\\ some basic functions for Z*_p \\ Sept 15, 2009 - andrewl IsGenerator(a,p) = { local(ok); ok=1; fordiv(p-1,x, if(x == p-1, next; ); if(a^x % p == 1, ok=0; break; ); ); ok; }; GetGenerators(p) = { local(v); v=[]; for(i=2,p-1, if(IsGenerator(i,p), v=concat(v,i); ); ); v; }; GetSubgroups(p) = { local(g,d,n,m,incr); d = divisors(p-1); m = matrix(#d,1); g = GetGenerators(p)[1]; \\print("using generator ",g); for(i=1,#d, incr = (p-1)/d[i]; \\print("incr is ", incr); m[i,1] = []; forstep(j=0,p-2,incr, \\print("calculating ",g,"^",j," % ",p); m[i,1] = concat(m[i,1], g^j % p); ); ); m; }