1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]

//! *See the [FLINT documentation](http://flintlib.org/doc/padic_mat.html).

use crate::deps::*;
use crate::flint::*;
use crate::fmpq_mat::fmpq_mat_struct;
use crate::fmpz::fmpz;
use crate::fmpz_mat::fmpz_mat_struct;
use crate::padic::{padic_ctx_struct, padic_struct};
use libc::{c_int, FILE};

#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct padic_mat_struct {
    pub mat: fmpz_mat_struct,
    pub val: mp_limb_signed_t,
    pub N: mp_limb_signed_t,
}

pub type padic_mat_t = [padic_mat_struct; 1usize];

extern "C" {
    pub fn padic_mat(A: *mut padic_mat_struct) -> *mut fmpz_mat_struct;
    pub fn padic_mat_entry(
        A: *mut padic_mat_struct,
        i: mp_limb_signed_t,
        j: mp_limb_signed_t,
    ) -> *mut fmpz;
    pub fn padic_mat_get_val(A: *mut padic_mat_struct) -> mp_limb_signed_t;
    pub fn padic_mat_get_prec(A: *mut padic_mat_struct) -> mp_limb_signed_t;
    pub fn padic_mat_nrows(A: *mut padic_mat_struct) -> mp_limb_signed_t;
    pub fn padic_mat_ncols(A: *mut padic_mat_struct) -> mp_limb_signed_t;
    pub fn padic_mat_init(A: *mut padic_mat_struct, r: mp_limb_signed_t, c: mp_limb_signed_t);
    pub fn padic_mat_init2(
        A: *mut padic_mat_struct,
        r: mp_limb_signed_t,
        c: mp_limb_signed_t,
        prec: mp_limb_signed_t,
    );
    pub fn padic_mat_clear(A: *mut padic_mat_struct);
    pub fn _padic_mat_canonicalise(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct);
    pub fn _padic_mat_reduce(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct);
    pub fn padic_mat_reduce(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct);
    pub fn padic_mat_is_empty(A: *mut padic_mat_struct) -> c_int;
    pub fn padic_mat_is_square(A: *mut padic_mat_struct) -> c_int;
    pub fn padic_mat_is_canonical(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct) -> c_int;
    pub fn padic_mat_is_reduced(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct) -> c_int;
    pub fn padic_mat_set(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_swap(A: *mut padic_mat_struct, B: *mut padic_mat_struct);
    pub fn padic_mat_zero(A: *mut padic_mat_struct);
    pub fn padic_mat_one(A: *mut padic_mat_struct);
    pub fn padic_mat_set_fmpq_mat(
        B: *mut padic_mat_struct,
        A: *mut fmpq_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_get_fmpq_mat(
        B: *mut fmpq_mat_struct,
        A: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_get_entry_padic(
        rop: *mut padic_struct,
        op: *mut padic_mat_struct,
        i: mp_limb_signed_t,
        j: mp_limb_signed_t,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_set_entry_padic(
        rop: *mut padic_mat_struct,
        i: mp_limb_signed_t,
        j: mp_limb_signed_t,
        op: *mut padic_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_equal(A: *mut padic_mat_struct, B: *mut padic_mat_struct) -> c_int;
    pub fn padic_mat_is_zero(A: *mut padic_mat_struct) -> c_int;
    pub fn padic_mat_fprint(
        file: *mut FILE,
        A: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    ) -> c_int;
    pub fn padic_mat_fprint_pretty(
        file: *mut FILE,
        A: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    ) -> c_int;
    pub fn padic_mat_print(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct) -> c_int;
    pub fn padic_mat_print_pretty(A: *mut padic_mat_struct, ctx: *mut padic_ctx_struct) -> c_int;
    pub fn padic_mat_randtest(
        mat: *mut padic_mat_struct,
        state: *mut flint_rand_s,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_transpose(B: *mut padic_mat_struct, A: *mut padic_mat_struct);
    pub fn _padic_mat_add(
        C: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        B: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_add(
        C: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        B: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn _padic_mat_sub(
        C: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        B: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_sub(
        C: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        B: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn _padic_mat_neg(B: *mut padic_mat_struct, A: *mut padic_mat_struct);
    pub fn padic_mat_neg(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn _padic_mat_scalar_mul_padic(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        c: *mut padic_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_scalar_mul_padic(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        c: *mut padic_struct,
        ctx: *mut padic_ctx_struct,
    );
    pub fn _padic_mat_scalar_mul_fmpz(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        c: *mut fmpz,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_scalar_mul_fmpz(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        c: *mut fmpz,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_scalar_div_fmpz(
        B: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        c: *mut fmpz,
        ctx: *mut padic_ctx_struct,
    );
    pub fn padic_mat_mul(
        C: *mut padic_mat_struct,
        A: *mut padic_mat_struct,
        B: *mut padic_mat_struct,
        ctx: *mut padic_ctx_struct,
    );
}