double_point function
Implementation
void double_point(Point p1, BigInt a, BigInt p) {
BigInt lambda;
BigInt l1;
BigInt x1;
// ignore: unused_local_variable
BigInt y1;
// set_huge( &lambda, 0 );
lambda = BigInt.from(0);
// set_huge( &x1, 0 );
x1 = BigInt.from(0);
// set_huge( &y1, 0 );
y1 = p1.y;
// set_huge( &lambda, 2 ); // lambda = 2;
lambda = BigInt.from(2);
// multiply( &lambda, &p1->y ); // lambda = 2 * y1
lambda = lambda * p1.y;
// inv( &lambda, p ); // lambda = ( 2 * y1 ) ^ -1 (% p)
lambda = lambda.modInverse(p);
// set_huge( &l1, 3 ); // l1 = 3
l1 = BigInt.from(3);
// multiply( &l1, &p1->x ); // l1 = 3 * x
l1 = l1 * p1.x;
// multiply( &l1, &p1->x ); // l1 = 3 * x ^ 2
l1 = l1 * p1.x;
// add( &l1, a ); // l1 = ( 3 * x ^ 2 ) + a
l1 = l1 + a;
// multiply( &lambda, &l1 ); // lambda = [ ( 3 * x ^ 2 ) + a ] / [ 2 * y1 ] ) % p
lambda = lambda * l1;
// copy_huge( &y1, &p1->y );
y1 = p1.y;
// // Note - make two copies of x2; this one is for y1 below
// copy_huge( &p1->y, &p1->x );
p1.y = p1.x;
// set_huge( &x1, 2 );
x1 = BigInt.from(2);
// multiply( &x1, &p1->x ); // x1 = 2 * x1
x1 = x1 * p1.x;
// copy_huge( &p1->x, &lambda ); // x1 = lambda
p1.x = lambda;
// multiply( &p1->x, &lambda ); // x1 = ( lambda ^ 2 );
p1.x = p1.x * lambda;
// subtract( &p1->x, &x1 ); // x1 = ( lambda ^ 2 ) - ( 2 * x1 )
p1.x = p1.x - x1;
// divide( &p1->x, p, NULL ); // [ x1 = ( lambda ^ 2 ) - ( 2 * x1 ) ] % p
p1.x = p1.x ~/ p;
// if ( p1->x.sign )
// {
// subtract( &p1->x, p );
// p1->x.sign = 0;
// subtract( &p1->x, p );
// }
// subtract( &p1->y, &p1->x ); // y3 = x3 � x1
// multiply( &p1->y, &lambda ); // y3 = lambda * ( x3 - x1 );
// subtract( &p1->y, &y1 ); // y3 = ( lambda * ( x3 - x1 ) ) - y1
// divide( &p1->y, p, NULL ); // y3 = [ ( lambda * ( x3 - x1 ) ) - y1 ] % p
// if ( p1->y.sign )
// {
// p1->y.sign = 0;
// subtract( &p1->y, p );
// p1->y.sign = 0;
// }
// free_huge( &lambda );
// free_huge( &x1 );
// free_huge( &y1 );
// free_huge( &l1 );
}