index-calculus.gp

p=3023;
g=Mod(5,p);
y=Mod(555,p);
l=14;

base=primes(l);
maxprime=base[l];

if(type(rels)=="t_POL",rels=[]);

makerels=() -> {
    my(r,f,m,i,j,rel);
    rel=[];
    for(i=1,100,
        r=random(p-1);
        f=factor(lift(g^r));
	for(j=1,matsize(f)[1],
            if(f[j,1] > maxprime,next(2)));
        rel=concat(rel,[[r,f]]));
    rel;
};

findxrel=() -> {
    my(j,r,f);
    until(0,
          r=random(p-1);
          f=factor(lift(y*g^r));
	  for(j=1,matsize(f)[1],
              if(f[j,1] > maxprime,next(2)));
          return([r,f]);)
};

factoredtosparse=(u) -> {
    my(i,r,j);
    r=vector(l);
    j=1;
    for(i=1,l,if(u[j,1] == base[i],r[i]=u[j,2];j=j+1;if(j>matsize(u)[1],break)));
    r;
};

makematrix=(rels) -> {
    my(A,y,t);
    A = [];
    y = vector(length(rels));
    for(i=1,length(rels),
	y[i] = rels[i][1];
        A = concat(A, [ factoredtosparse(rels[i][2])~ ]););
    [Mat(A)~,y~];
};

dosieve=() -> {
    until((matrank(Aq)==l) && (matrank(A2)==l),
        print("One");
        rels=concat(rels, makerels());
        print("Two");
        R = makematrix(rels);
        print("Three");
        Aq = Mod(R[1],(p-1)/2);
        yq = Mod(R[2],(p-1)/2);
        A2 = Mod(R[1],2);
        y2 = Mod(R[2],2););
};

dolinalg=() -> {
    rq = matindexrank(Aq)[1];
    AAq = vecextract(Aq~,rq)~;
    yyq = vecextract(yq,rq);
    uq = matsolve(AAq,yyq);
    r2 = matindexrank(A2)[1];
    AA2 = vecextract(A2~,r2)~;
    yy2 = vecextract(y2,r2);
    u2 = matsolve(AA2,yy2);
    u=chinese(uq,u2)
};

dofinal=() -> {
    r1 = findxrel();
    r2 = factoredtosparse(r1[2]);
    dlog = lift(Mod(-r1[1],p-1) + sum(i=1,l,r2[i]*u[i]));
};
2010-10-01, Kristian Gjøsteen