proposed acb_norm() function

3 views
Skip to first unread message

American Citizen

unread,
Nov 12, 2025, 1:14:10 PM (yesterday) Nov 12
to flint-devel
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

Aasim

unread,
12:15 AM (14 hours ago) 12:15 AM
to flint...@googlegroups.com
> arb_mul(re_sq,re,re,prec);
> arb_mul(im_sq,im,im,prec);

It might be better to use arb_sqr instead of arb_mul. 

--

---
You received this message because you are subscribed to the Google Groups "flint-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email to flint-devel...@googlegroups.com.
To view this discussion, visit https://groups.google.com/d/msgid/flint-devel/56025119-1e03-4550-bebb-5bd6a7ad9364n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages