I would like to propose a complex modulus or norm for acb_t variables, called acb_norm(). This is the exact same thing as complex modulus, or norm. It is also written as |C| and Abs(C) where C is a complex variable.
I post the function and main() below, which also takes advantage of the acb_set_str() function to input strings into complex numbers.
#include <stdio.h>
#include <string.h>
#include "flint/acb.h"
#include "acb_set_str.h"
int acb_norm(arb_t mod, const acb_t x, const slong prec)
{
arb_t re, im, re_sq, im_sq, mod_sq;
arb_init(re); arb_init(im);
arb_init(re_sq); arb_init(im_sq);
arb_init(mod_sq);
// get real and imag parts
arb_set(re, acb_realref(x));
arb_set(im, acb_imagref(x));
// find squares for each part
arb_mul(re_sq,re,re,prec);
arb_mul(im_sq,im,im,prec);
arb_clear(re); arb_clear(im);
// find square of the modulus
arb_add(mod_sq,re_sq,im_sq,prec);
arb_clear(re_sq); arb_clear(im_sq);
arb_sqrt(mod, mod_sq, prec);
arb_clear(mod_sq);
int error = 0;
return error;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
fprintf(stderr, "Usage: %s <input_string>\n", argv[0]);
return 1;
}
int error = 0;
arb_t norm;
arb_init(norm);
acb_t result;
acb_init(result);
slong bit_precision = 128; // Example precision
slong digits = 38;
printf("Using bit precision = %d decimal digits: %d\n",bit_precision, digits);
error = acb_set_str(result, argv[1], bit_precision);
if (error) {
fprintf(stderr, "Error setting complex number from string.\n");
} else {
printf("Complex number: [");
arb_printd(acb_realref(result), 20); // Print real part
printf("] + [");
arb_printd(acb_imagref(result), 20); // Print imaginary part
printf("]*i\n");
}
printf("Testing norm function:\n");
error = acb_norm(norm, result, bit_precision);
if (error) {
fprintf(stderr, "Error occurred while finding norm.\n");
} else {
printf("Complex modulus or norm: ");
arb_printd(norm, digits);
printf("\n");
}
arb_clear(norm);
acb_clear(result);
return 0;
}
---------------------------
The compile line was "gcc -o chk_mod acb_norm.c acb_set_str.c -lflint