class Vector:
    def __init__(self,vlist):
        self.vlist=vlist.copy()
        self.n_dim=len(vlist)
        
 
    def __repr__(self):
        return str(self.vlist)
 
    def len(self):
        return len(self.vlist)
    
    def __getitem__(self,index):
        return self.vlist[index]
    
    def __setitem__(self, index, val):
        self.vlist[index] = val
 
    def copy(self):
        new=Vector(self.vlist)
        return new
 
    def check_dim(self,v2):
        if type(v2) != Vector:
            raise Exception("vector expected")                  
        if self.n_dim != v2.n_dim:
            raise Exception("v not same size")  
 
    def __eq__(self, v2):
        self.check_dim(v2)
        
        for i in range(self.len()):
            if self[i]!=v2[i]:
                return False
        return True
    
    def __add__(self,v2):
        self.check_dim(v2)
        new=[None for _ in range(self.len())]
        for i in range(self.len()):
            new[i]=self[i]+v2[i]
 
        vnew=Vector(new)
        return vnew
    
    def __sub__(self,v2):
        self.check_dim(v2)
        new=[None for _ in range(self.len())]
        for i in range(self.len()):
            new[i]=self[i]-v2[i]
        vnew=Vector(new)
        return vnew
 
    def __mul__(self,v2):
        if type(v2)==Vector:
            return self.dotP(v2)
        else:
            return self.scalar_mul(v2)
        
    def __div__(self,v2):
        if type(v2)==Vector:
            raise Exception("scalar div only")
        return self.scalar_div(v2)
    
    def scalar_mul(self,v2:float):
        new=[None for _ in range(self.len())]
        for i in range(self.len()):
            new[i]=self[i]*v2
 
        vnew=Vector(new)
        return vnew
 
    def scalar_div(self,v2:float):
        new=[None for _ in range(self.len())]
        for i in range(self.len()):
            new[i]=self[i]/v2
 
        vnew=Vector(new)
        return vnew
 
 
    def dotP(self,v2):
        """DOT PRODUCT"""
        self.check_dim(v2)
        new=[None for _ in range(self.len())]
        for i in range(self.len()):
            new[i]=self[i]*v2[i]
        return sum(new)
 
    def norm(self)->float:
        sqsum=0
        for v in self.vlist:
            sqsum+=v**2
        return sqsum**(0.5)