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
| # -*- coding: utf-8 -*-
from fractions import Fraction #version python >= 2.6
class MyError(Exception):
"""Erreur custom"""
def __init__(self,value):
self.value=value
def __str__(self):
return repr(self.value)
######Modélisation des corps Z/pZ avec p premier#####
def GenZp(p):
"""génère la classe paramétrée Z/pZ"""
class C(object):
car=p
def __init__(self,m):
"""initialisation à partir d'un entier"""
self.m=m%self.car
def __str__(self):
"""représentation externe pour print etc..."""
return str(self.m)
def __eq__(self,other):
"""test d'égalité"""
return self.m==other.m
def nul(self):
"""test de nullité"""
return self.m==0
### les opérateurs unaires
def __neg__(self):
"""opposé"""
return C(-self.m)
def __invert__(self):
"""inverse"""
if not self.nul():
y=1
while (self.m*y)%self.car != 1:
y+=1
return C(y)
### les opérations binaires
def __add__(self,other):
"""addition"""
return C(self.m+other.m)
def __mul__(self,other):
"""multiplication"""
if type(self)==type(other):#de deux éléments du même corps
return C(self.m*other.m)
else:#d'un scalaire par un vecteur
return other.__rmul__(self)
def __sub__(self,other):
"""soustraction"""
return C(self.m-other.m)
def __div__(self,other):
return self*~(other)
def __pow__(self,k):
"""puissances"""
if k >=0:
return C(self.m**k)
else:
return ~self**(-k)
return C
#####fin de la modélisation des corps Z/pZ###############################
####Espaces vectoriels K^n K corps quelconque n entier quelconque##############
class VecteurKn:
"""modélisation des vecteurs à n dimensions corps quelconque"""
def __init__(self,L):
"""constructeur"""
self.V=L
self.n=len(L)
def __str__(self):
"""représentation externe print, etc..."""
L=[str(x) for x in self.V]
return '('+ ",".join(L)+')'
def __eq__(self,other):
"""test d'égalité"""
return self.n==other.n and all(self.L[i]==other.L[i] for i in xrange(0,self.n))
def __add__(self,other):
"""addition des vecteurs"""
if self.n!=other.n:
raise MyError("Tailles non concordantes")
else:
L=[self.V[i]+other.V[i] for i in range(0,self.n)]
return VecteurKn(L)
def __neg__(self):
"""opposé d'un vecteur"""
return VecteurKn([-x for x in self.V])
def __sub__(self,other):
"""différence de deux vecteurs"""
return self+(-other)
def __rmul__(self,k):
""" produit par un scalaire """
L=[k*x for x in self.V]
return VecteurKn(L)
####fin de la définition des espaces vectoriels###############
###########Modélisation des espaces affines###################
class PointKn:
"""modélisation des espaces affines K^n n et K quelconques"""
def __init__(self,L):
"""constructeur"""
self.C=L #coordonnées
self.n=len(L)
def __str__(self):
"""représentation externe print, etc..."""
L=[str(x) for x in self.C]
return '('+ ",".join(L)+')'
def __eq__(self,other):
"""test d'égalité"""
return self.n==other.n and all(self.C[i]==other.C[i] for i in xrange(0,self.n))
def __add__(self,vecteur):
"""opération du groupe additif des vecteurs"""
if self.n != vecteur.n:
raise MyError("Tailles non concordantes")
else:
L=[self.C[i]+vecteur.V[i] for i in range(0,self.n)]
return PointKn(L)
def __sub__(self,other):
"""vecteur différence de deux points"""
if self.n != other.n:
raise MyError("Tailles non concordantes")
else:
L=[self.C[i]-other.C[i] for i in range(0,self.n)]
return VecteurKn(L)
###fin de la modélisation des espaces affines###################### |
Partager