-
Notifications
You must be signed in to change notification settings - Fork 0
/
modulus.c
79 lines (75 loc) · 2.07 KB
/
modulus.c
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
#include "algebra.h"
#include "modulus.h"
/**
* [EN] This method returns a modular number, known as residue (r), that satisfies:
* [PT] Esse metodo retorna um numero em modulo, conhecido como residuo (r), que satisfaz:
* n|(a - r)
* @param input_number (a)
* @param modulus_number (n)
* @return output_number (r) a positive number
*/
unsigned long long int modulus(long long int input_number, unsigned long long int modulus_number)
{
unsigned long long int output_number = 0;
if(is_negative(input_number)==TRUE)
{
output_number = (input_number % modulus_number) + input_number;
}
else
{
output_number = (input_number % modulus_number);
}
return output_number;
}
unsigned long long int exponential_modulus(long long int base, long long int exponant, long long int modulus_number){
unsigned long long int result = 0;
result = modulus(base, modulus_number);
long long int count = 1;
while(count < exponant)
{
if(result > modulus_number)
{
result = modulus(result, modulus_number);
}
else
{
result = modulus(result*base, modulus_number);
count++;
}
}
return result;
}
/**
* [EN] This method check if the congruence is valid
* [PT] Esse metodo verifica se a congruencia e valida
* n|(a - r)
* @param a_number (a)
* @param b_number (r)
* @param modulus_number (n)
* @return TRUE if is congruent or False if is not congruent
*/
Boolean is_congruent(long long int a_number, long long int b_number, unsigned long long int modulus_number)
{
Boolean is_congruent = is_divisible((a_number - b_number), modulus_number);
return is_congruent;
}
/**
* [EN] This method discover the quantity of numbers n < x who not satisfies x|n
* [PT] Esse metodo descobre a quantitade de numeros n < x que nao satisfaz x|n
* @param input_number (x)
* @return phi (n)
*/
unsigned long long int euler_totient(unsigned long long int input_number)
{
unsigned long long int associated_number = 1;
unsigned long long int phi = 0;
while(associated_number < input_number)
{
if(is_divisible(input_number, input_number) == FALSE)
{
phi++;
}
associated_number++;
}
return phi;
}