ca_vec.h – vectors of real and complex numbers

A ca_vec_t represents a vector of real or complex numbers, implemented as an array of coefficients of type ca_struct.

Most functions are provided in two versions: an underscore method which operates directly on pre-allocated arrays of coefficients (taking ca_ptr and ca_srcptr arguments), and a non-underscore method which takes ca_vec_t input and performs automatic memory management.

Unlike ca_poly_t, a ca_vec_t is not normalised by removing zero coefficients; it retains the exact length assigned by the user.

Types, macros and constants

type ca_vec_struct
type ca_vec_t

Contains a pointer to an array of entries (coeffs), the used length (length), and the allocated size of the array (alloc).

A ca_vec_t is defined as an array of length one of type ca_vec_struct, permitting an ca_vec_t to be passed by reference.

ca_vec_entry(vec, i)

Macro returning a pointer to entry i in the vector vec. The index must be in bounds.

Memory management

ca_ptr _ca_vec_init(slong len, ca_ctx_t ctx)

Returns a pointer to an array of len coefficients initialized to zero.

void ca_vec_init(ca_vec_t vec, slong len, ca_ctx_t ctx)

Initializes vec to a length len vector. All entries are set to zero.

void _ca_vec_clear(ca_ptr vec, slong len, ca_ctx_t ctx)

Clears all len entries in vec and frees the pointer vec itself.

void ca_vec_clear(ca_vec_t vec, ca_ctx_t ctx)

Clears the vector vec.

void _ca_vec_swap(ca_ptr vec1, ca_srcptr vec2, slong len, ca_ctx_t ctx)

Swaps the entries in vec1 and vec2 efficiently.

void ca_vec_swap(ca_vec_t vec1, ca_vec_t vec2, ca_ctx_t ctx)

Swaps the vectors vec1 and vec2 efficiently.

Length

slong ca_vec_length(const ca_vec_t vec, ca_ctx_t ctx)

Returns the length of vec.

void _ca_vec_fit_length(ca_vec_t vec, slong len, ca_ctx_t ctx)

Allocates space in vec for len elements.

void ca_vec_set_length(ca_vec_t vec, slong len, ca_ctx_t ctx)

Sets the length of vec to len. If vec is shorter on input, it will be zero-extended. If vec is longer on input, it will be truncated.

Assignment

void _ca_vec_set(ca_ptr res, ca_srcptr src, slong len, ca_ctx_t ctx)

Sets res to a copy of src of length len.

void ca_vec_set(ca_vec_t res, const ca_vec_t src, ca_ctx_t ctx)

Sets res to a copy of src.

Special vectors

void _ca_vec_zero(ca_ptr res, slong len, ca_ctx_t ctx)

Sets the len entries in res to zeros.

void ca_vec_zero(ca_vec_t res, slong len, ca_ctx_t ctx)

Sets res to the length len zero vector.

Input and output

void ca_vec_print(const ca_vec_t vec, ca_ctx_t ctx)

Prints vec to standard output. The coefficients are printed on separate lines.

void ca_vec_printn(const ca_vec_t poly, slong digits, ca_ctx_t ctx)

Prints a decimal representation of vec with precision specified by digits. The coefficients are comma-separated and the whole list is enclosed in square brackets.

List operations

void ca_vec_append(ca_vec_t vec, const ca_t f, ca_ctx_t ctx)

Appends f to the end of vec.

Arithmetic

void _ca_vec_neg(ca_ptr res, ca_srcptr src, slong len, ca_ctx_t ctx)
void ca_vec_neg(ca_vec_t res, const ca_vec_t src, ca_ctx_t ctx)

Sets res to the negation of src.

void _ca_vec_add(ca_ptr res, ca_srcptr vec1, ca_srcptr vec2, slong len, ca_ctx_t ctx)
void _ca_vec_sub(ca_ptr res, ca_srcptr vec1, ca_srcptr vec2, slong len, ca_ctx_t ctx)

Sets res to the sum or difference of vec1 and vec2, all vectors having length len.

void _ca_vec_scalar_mul_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx)

Sets res to src multiplied by c, all vectors having length len.

void _ca_vec_scalar_div_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx)

Sets res to src divided by c, all vectors having length len.

void _ca_vec_scalar_addmul_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx)

Adds src multiplied by c to the vector res, all vectors having length len.

void _ca_vec_scalar_submul_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx)

Subtracts src multiplied by c from the vector res, all vectors having length len.

Comparisons and properties

truth_t _ca_vec_check_is_zero(ca_srcptr vec, slong len, ca_ctx_t ctx)

Returns whether vec is the zero vector.

Internal representation

int _ca_vec_is_fmpq_vec(ca_srcptr vec, slong len, ca_ctx_t ctx)

Checks if all elements of vec are structurally rational numbers.

int _ca_vec_fmpq_vec_is_fmpz_vec(ca_srcptr vec, slong len, ca_ctx_t ctx)

Assuming that all elements of vec are structurally rational numbers, checks if all elements are integers.

void _ca_vec_fmpq_vec_get_fmpz_vec_den(fmpz *c, fmpz_t den, ca_srcptr vec, slong len, ca_ctx_t ctx)

Assuming that all elements of vec are structurally rational numbers, converts them to a vector of integers c on a common denominator den.

void _ca_vec_set_fmpz_vec_div_fmpz(ca_ptr res, const fmpz *v, const fmpz_t den, slong len, ca_ctx_t ctx)

Sets res to the rational vector given by numerators v and the common denominator den.