Skip to content

Instantly share code, notes, and snippets.

@MurageKibicho
Created August 27, 2025 01:55
Show Gist options
  • Select an option

  • Save MurageKibicho/a8a34ceceff7e94e7b7f77cca464d8b9 to your computer and use it in GitHub Desktop.

Select an option

Save MurageKibicho/a8a34ceceff7e94e7b7f77cca464d8b9 to your computer and use it in GitHub Desktop.
FP_2ScalarPower
void FP2_Multiply(AlgebraicInteger result, AlgebraicInteger a, AlgebraicInteger b, fmpz_t primeNumber)
{
if(!fmpz_equal(a->D, b->D))
{
flint_printf("FP2_Multiply Error: Different D values\n");
exit(1);
}
fmpz_t temp1;
fmpz_init(temp1);
//result->x
fmpz_mul(temp1, a->D, a->y);
fmpz_mul(result->x, temp1, b->y);
fmpz_mul(temp1, a->x, b->x);
fmpz_add(result->x, result->x, temp1);
fmpz_mod(result->x, result->x, primeNumber);
//result->y
fmpz_mul(temp1, a->x, b->y);
fmpz_mul(result->y, a->y, b->x);
fmpz_add(result->y, result->y, temp1);
fmpz_mod(result->y, result->y, primeNumber);
//result->D
fmpz_set(result->D,a->D);
fmpz_clear(temp1);
}
void FP2_ScalarPower(AlgebraicInteger result, AlgebraicInteger base, AlgebraicInteger temp0, AlgebraicInteger currentBase, fmpz_t privateKey, fmpz_t primeNumber)
{
//Set result to infinity
fmpz_set_ui(result->x, 1);
fmpz_set_ui(result->y, 0);
fmpz_set(result->D, base->D);
CopyPoint(base,currentBase);
//Find no. of bits in private key
size_t binaryLength = fmpz_sizeinbase(privateKey, 2);
for(ssize_t i = 0; i < binaryLength; i++)
{
if(fmpz_tstbit(privateKey, i) != 0)
{
FP2_Multiply(temp0, result, currentBase, primeNumber);
CopyPoint(temp0,result);
}
FP2_Multiply(temp0, currentBase, currentBase, primeNumber);
CopyPoint(temp0,currentBase);
//fmpz_print(base->x);printf(" ");fmpz_print(base->y);printf("\n");
}
}
void TestScalarPower()
{
AlgebraicInteger result = CreatePoint();
AlgebraicInteger base = CreatePoint();
AlgebraicInteger temp0 = CreatePoint();
AlgebraicInteger temp1 = CreatePoint();
fmpz_t privateKey, primeNumber;
fmpz_init(privateKey);
fmpz_init(primeNumber);
fmpz_set_ui(primeNumber, 37);
fmpz_set_ui(privateKey, 6);
fmpz_set_ui(base->x, 25);
fmpz_set_ui(base->y, 33);
fmpz_set_ui(base->D, 2);
FP2_ScalarPower(result, base, temp0, temp1, privateKey, primeNumber);
fmpz_print(result->x);
printf(" ");
fmpz_print(result->y);
printf("\n");
fmpz_clear(privateKey);
fmpz_clear(primeNumber);
DestroyPoint(result);
DestroyPoint(base);
DestroyPoint(temp0);
DestroyPoint(temp1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment