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
|
.\" Copyright 2026 Andrew V.Kosteltsev (kx@radix-linux.su)
.\"
.\"
.TH ipowm1_mod 3 "September 14, 2026" "libmpu" "LibMPU Programmer's Manual"
.SH NAME
\fBipowm1_mod\fP \- modular multiplicative inverse of an unsigned integer
.SH SYNOPSIS
.nf
.B #include <libmpu.h>
.PP
.BI "void ipowm1_mod( mpu_int *" c ", mpu_int *" a ", mpu_int *" m ", int " nb " );"
.fi
.SH DESCRIPTION
The \fBipowm1_mod()\fP function computes the modular multiplicative inverse
.sp
.nf
c = a^(-1) mod m
.fi
.sp
for unsigned integers. The result \fBc\fP exists when \fBgcd(a, m) == 1\fP and satisfies
.sp
.nf
(a * c) mod m = 1.
.fi
.sp
The extended Euclidean algorithm is used. The memory contents at addresses \fBa\fP and
\fBm\fP are not changed. The \fBnb\fP parameter determines the size of all operands, in bytes.
.PP
If \fBgcd(a, m) != 1\fP, a multiplicative inverse does not exist; in this case \fBc\fP is
set to zero and the \fBZ\fP flag is set. For \fBm == 1\fP the function also returns zero and
sets \fBZ\fP.
.PP
If \fBm\fP is zero, the value at \fBc\fP is not changed, the \fBV\fP (Invalid operation)
flag is set, and \fB__mpu_integer_error_no\fP is set to \fB__I_ENUMBER__\fP.
.sp
.SH EXAMPLES
.nf
.sp
#include <libmpu.h>
#include <stdio.h>
int main( void )
{
mpu_int1024_t c, a, m;
int nb = NB_I1024;
__mpu_char8_t s[4096];
__mpu_init();
iatoui( a, "89", nb );
iatoui( m, "456", nb );
ipowm1_mod( c, a, m, nb );
iuitoa( s, c, RADIX_DEC, LOWERCASE, nb );
printf( "c = %s;\\n", s ); /* c = 41; */
__mpu_free_context();
return( 0 );
}
.fi
.sp
.SH SEE ALSO
.BR iadd(3),
.BR isub(3),
.BR iadc(3),
.BR isbb(3),
.BR ineg(3),
.BR inot(3),
.BR iand(3),
.BR itest(3),
.BR icmp(3),
.BR ior(3),
.BR ixor(3),
.BR iinc(3),
.BR idec(3),
.BR ixchg(3),
.BR icpy(3),
.BR icvt(3),
.BR imul(3),
.BR ismul(3),
.BR idiv(3),
.BR isdiv(3),
.BR iatoi(3),
.BR iatoui(3),
.BR iitoa(3),
.BR iuitoa(3),
.BR _int_digs(3),
.BR ibits_len(3),
.BR igcd(3),
.BR ilcm(3),
.BR imod(3),
.BR imul_mod(3),
.BR ipow_mod(3),
.BR shifts(3),
.BR shifts\-n(3),
.BR circular\-shifts(3),
.BR circular\-shifts\-n(3),
.BR integer\-flags(3),
.BR real\-flags(3),
.BR libmpu(7).
|