-
Notifications
You must be signed in to change notification settings - Fork 0
/
R1.py
77 lines (61 loc) · 2.41 KB
/
R1.py
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
'''
UFRPE - BSI 2019.1
Matemática Discreta - prof. Marcelo Gama
Dupla: Edson Kropniczki + Cristina Oliveira
Problema R1:
------------
Uma senha s foi compartilhada entre duas pessoas. A primeira delas recebeu
o par de inteiros (a,m) e a segunda recebeu o par (b,n), onde mdc(m,n) = 1
e a,b,m,n foram calculados de modo que
s ≡ a (mod m)
s ≡ b (mod n)
Implemente um programa que recebe os pares de inteiros (a,m) e (b,n) e
(a) verifica se o sistema tem solução e informa isso ao usuário;
(b) caso tenha solução s, a encontra através do método geométrico e imprime essa senha.
'''
def mdc(p, q): # função auxiliar recursiva que retorna o MDC entre dois inteiros
r = p % q
if r == 0:
return q
return mdc(q, r)
# Loop para entrada e validação dos dados
while 1:
try:
a, m = [int(x) for x in input("Entre o par (a, m) separado por espaço: ").split()]
if (a >= m) or (a < 0) or (m < 2):
raise ValueError
print("(a, m) = (%d, %d)" % (a, m))
b, n = [int(x) for x in input("Entre o par (b, n) separado por espaço: ").split()]
if (b >= n) or (b < 0) or (n < 2):
raise ValueError
print("(b, n) = (%d, %d)" % (b, n))
break
except ValueError:
print("Entrada inválida! Por favor, entre novamente os dados.")
# (a) para o sistema ter solução, é necessário que o MDC entre m e n seja = 1
MDC = mdc(m, n)
print("MDC(%d, %d) = %d" % (m, n, MDC))
if MDC != 1:
print("O sistema não tem solução, pois m e n não são primos entre si.")
exit()
print("...calculando...dependendo das entradas, isso pode levar alguns minutos...")
# (b) simulação de preenchimento de matriz m X n para mimetizar o método geométrico
x = y = s = 0
while 1:
# print("(x, y) = (%d, %d)" % (x, y)) # debug
if x == a and y == b: # bingo! chegamos à linha (x) e coluna (y) dadas por (a, b)
break
# incrementa a linha (x), a coluna (y) e o resultado correspondente à posição (x, y)
s += 1
x += 1
y += 1
# sai do loop qdo percorrer toda a matriz
if x == m and y == n:
break
# retorna para a posição 0 quando a posição na linha cai fora da matriz
if x == m:
x = 0
# retorna para a posição 0 quando a posição na coluna cai fora da matriz
if y == n:
y = 0
print("Solução: s = %d" % s)