public ECPunkt sumaPunktow (ECPunkt Q,ECPunkt P)
	{
		if (Q.X.b.equals(P.X.b) && Q.Y.b.equals(P.Y.b))
			return podwojeniePunktu(Q);
		if (Q.X.b.equals(BigInteger.ZERO) && Q.Y.b.equals(BigInteger.ZERO))
			return new ECPunkt(P);
		else if (P.X.b.equals(BigInteger.ZERO) && P.Y.b.equals(BigInteger.ZERO))
			return new ECPunkt(Q);
		/////////////////F2m - wsprzdne rzutowe////////////////
//		ECPunkt wynik = new ECPunkt(P);
//		
//		GF2Elem lambda1 = new GF2Elem(P.Z);		lambda1.square().multiply(Q.X.bB);
//		GF2Elem lambda2 = new GF2Elem(Q.Z);		lambda2.square().multiply(P.X.bB);
//		GF2Elem lambda3 = new GF2Elem(lambda1);	lambda3.add(lambda2.bB);
//		GF2Elem lambda4 = new GF2Elem(P.Z);		lambda4.square().multiply(P.Z.bB).multiply(Q.Y.bB);
//		GF2Elem lambda5 = new GF2Elem(Q.Z);		lambda5.square().multiply(Q.Z.bB).multiply(P.Y.bB);
//		GF2Elem lambda6 = new GF2Elem(lambda4);	lambda6.add(lambda5.bB);
//		GF2Elem lambda7 = new GF2Elem(Q.Z);		lambda7.multiply(lambda3.bB);
//		GF2Elem temp1 = new GF2Elem(P.X);		temp1.multiply(lambda6.bB);
//		GF2Elem temp2 = new GF2Elem(P.Y);		temp2.multiply(lambda7.bB);
//		GF2Elem lambda8 = new GF2Elem(temp1);	temp1.multiply(temp2.bB);
//		
//		wynik.Z = new GF2Elem(P.Z);			wynik.Z.multiply(lambda7.bB);
//		GF2Elem lambda9 = new GF2Elem(wynik.Z);	lambda9.add(lambda6.bB);
//		
//		GF2Elem a2 = new GF2Elem(Q.a2, m, k);
//		GF2Elem temp3 = new GF2Elem(wynik.Z);	temp3.square().multiply(a2.bB);
//		GF2Elem temp4 = new GF2Elem(lambda6);	temp4.multiply(lambda9.bB);
//		wynik.X = new GF2Elem(lambda3);			wynik.X.square().multiply(lambda3.bB);
//												wynik.X.add(temp4.bB).add(temp3.bB);
//		
//		GF2Elem temp5 = new GF2Elem(lambda7);	temp5.square().multiply(lambda8.bB);
//		wynik.Y = new GF2Elem(wynik.X);			wynik.Y.multiply(lambda9.bB);
//												wynik.Y.add(temp5.bB);
//		return wynik;
//		///////////////////////F2m/////////////////////////////////
		GF2Elem a2 = new GF2Elem(Q.a2, m, k);
		GF2Elem temp1 = new GF2Elem(Q.Y);		temp1.dodaj(P.Y);
		GF2Elem temp2 = new GF2Elem(Q.X);		temp2.dodaj(P.X);
												try {
													temp2.odwrocModulo();
												} catch (Exception e) {
													e.printStackTrace();
												}
		GF2Elem lambda = new GF2Elem(temp1);	lambda.pomnoz(temp2);
		ECPunkt wynik = new ECPunkt(P);
		wynik.X = new GF2Elem(lambda);			wynik.X.doKwadratu().dodaj(lambda).dodaj(Q.X).dodaj(P.X).dodaj(a2);
		wynik.Y = new GF2Elem(Q.X);				wynik.Y.dodaj(wynik.X).pomnoz(lambda).dodaj(wynik.X).dodaj(Q.Y);
		return wynik;
	}