Je suis un étudiant universitaire de la Faculté d'agriculture qui étudie les mathématiques comme passe-temps. J'ai encore beaucoup de compétences en mathématiques et en programmation, donc je serais heureux si vous pouviez m'apprendre> <
Veuillez consulter un autre site pour plus de détails. Quand tu parles 1+1=0 1+0=1 0+1=1 0+0=0 Si vous le considérez comme un monde dans lequel les opérations sont définies (en termes algébriques, c'est la somme sur $ \ mathbb {F_2} $.)
C'est un travail à transformer en une forme pratique tout en conservant le rang de la matrice. Il est souvent agréable de connaître le rang (divers) De plus, si elle existe en cours de simplification, la matrice inverse peut être obtenue, la simplification est donc assez importante.
Tout d'abord, déterminez le calcul
def cal(a,b):
if a==1 and b==1:
return 0
elif a==1 and b==0:
return 1
elif a==0 and b==1:
return 1
else:
return 0
Ensuite, définissez l'ajout de lignes dans la matrice (car il est souvent utilisé).
def matcal(line1,line2):
ans=[0]*(len(line1))
for i in range(len(line1)):
ans[i]+=cal(line1[i],line2[i])
return ans
Tout ce que vous avez à faire est d'écrire celui qui simplifie (mais seulement jusqu'au triangle supérieur)
def simple(mat):
ans=copy.copy(mat)
rank=0
for i in range(len(mat[0])):
for j in range(rank,len(mat)):
if ans[j][i]==1:
for k in range(rank,len(mat)):
if ans[k][i]==1 and k!=j:
ans[k]=matcal(ans[k],ans[j])
if j==rank:
pass
else:
ans[j],ans[rank]=ans[rank],ans[j]
rank+=1
if rank==len(mat)-1:
return ans
break
else:
pass
return ans
Pour expliquer le flux grossièrement Permutez les lignes si vous recherchez des 1 dans la colonne de rang. Et supprimez (ajoutez) des 1 dans les lignes en dessous de vous. C'est comme répéter. Cela suffit si vous voulez le rang sans une simplification nette.
print(simple([[1,1,1],[1,1,0],[0,1,0]]))
>>>[[1, 1, 1], [0, 1, 0], [0, 0, 1]]
print(simple([[1,1,0],[1,1,0],[0,1,0]]))
>>>[[1, 1, 0], [0, 1, 0], [0, 0, 0]]
print(simple([[0,0,1],[0,1,0],[1,0,0]]))
>>>[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
C'est un sentiment agréable.
Vous pouvez dire le rang si vous passez à la simplification avec celle ci-dessus.
def rank(mat):
l=len(mat[0])
che=[0]*l
cnt=0
for i in range(len(mat)):
if mat[i]!=che:
cnt+=1
return cnt
Je veux pouvoir le faire avec $ Z / nZ $ au lieu de $ \ mathbb {F_2} $. Cependant, cette fois, l'élément inverse de 1 est 1, donc j'aurais dû me rajouter moi-même, mais si c'est $ Z / nZ $, cela peut être un peu difficile car je dois préparer un programme qui recherche l'élément inverse.
Recommended Posts