public ECPunkt podwojeniePunktu (ECPunkt P)
	{	
		if (P.X.b.equals(BigInteger.ZERO) && P.Y.b.equals(BigInteger.ZERO))
			return P;
		///////////////////F2m-wsprzdne rzutowe/////////
//		ECPunkt Q = new ECPunkt(P);
//		
//		GF2Elem dwa = new GF2Elem(new BigInteger("2"), m, k);
//		GF2Elem trzy = new GF2Elem(new BigInteger("3"), m, k);
//		GF2Elem cztery = new GF2Elem(new BigInteger("4"), m, k);
//		GF2Elem osiem = new GF2Elem(new BigInteger("8"), m, k);
//		GF2Elem a2 = new GF2Elem(Q.a2, m, k);
//		GF2Elem a6 = new GF2Elem(Q.a6, m, k);
//		
//		Q.Z = new GF2Elem(P.Z);				Q.Z.square().multiply(P.X.bB);
//		
//		GF2Elem A2 = new GF2Elem(Q.Z);		( A2.square() ).multiply(a2.bB);
//		GF2Elem A = new GF2Elem(A1);		A.add(A2.bB);
//		GF2Elem B = new GF2Elem(Q.Y);		B.multiply(Q.Z.bB);
//		GF2Elem C = new GF2Elem(Q.X);		( C.multiply(Q.Y.bB) ).multiply(B.bB);
//		GF2Elem D1 = new GF2Elem(A);		D1.square();
//		GF2Elem D2 = new GF2Elem(C);		D2.multiply(osiem.bB);
//		GF2Elem D = new GF2Elem(D1);		D.add(D2.bB);
//		
//		Q.X = new GF2Elem(dwa);				( Q.X.multiply(B.bB) ).multiply(D.bB);
//		GF2Elem temp1 = new GF2Elem(C);		temp1.multiply(cztery.bB);
//											temp1.add(D.bB);
//											temp1.multiply(A.bB);
//		GF2Elem temp2 = new GF2Elem(Q.Y);	( temp2.square() ).multiply(osiem.bB);
//											temp2.multiply(B.square().bB);
//		Q.Y = new GF2Elem(temp1);			Q.Y.add(temp2.bB);
//		Q.Z = new GF2Elem(B);				(( Q.Z.square() ).multiply(B.bB)).multiply(osiem.bB);
//		return Q;
		////////////////////F2m///////////////////////////
		ECPunkt Q = new ECPunkt(P);
		GF2Elem a6 = new GF2Elem(Q.a6, m, k);
		GF2Elem temp1 = new GF2Elem(P.X);		try {
													temp1.odwrocModulo();
												} catch (Exception e) {
													e.printStackTrace();
												}
		GF2Elem lambda = new GF2Elem(P.Y);		lambda.pomnoz(temp1).dodaj(P.X);
		GF2Elem x1squared = new GF2Elem(P.X);	x1squared.doKwadratu();	
		GF2Elem temp3 = new GF2Elem(x1squared);	try {
													temp3.odwrocModulo();
												} catch (Exception e) {
													e.printStackTrace();
												}
		Q.X = new GF2Elem(a6);					Q.X.pomnoz(temp3).dodaj(x1squared);
		Q.Y = new GF2Elem(lambda);				Q.Y.pomnoz(Q.X).dodaj(x1squared).dodaj(Q.X);
		return Q;
	}