import math

class Vector:
    """ 3D Vector

    Simple class that represents a 3D vector
    """

    def __init__(self, x = 0.0, y = 0.0, z = 0.0):
        """
        Creates a vector from it's coordinates
        """
        self.x = x
        self.y = y
        self.z = z

    def from_array(self, arr):
        """
        Creates a vector from an array
        """
        self.x = float(arr[0]) if len(arr) > 0 else None
        self.y = float(arr[1]) if len(arr) > 1 else None
        self.z = float(arr[2]) if len(arr) > 2 else None
        return self

    def __add__(self, other):
        """
        Sums two vectors
        """
        return Vector(self.x + other.x, self.y + other.y, self.z + other.z)

    def __sub__(self, other):
        """
        Subs two vectors
        """
        return Vector(self.x - other.x, self.y - other.y, self.z - other.z)

    def __mul__(self, other):
        """
        Computes the product between a vector and a number
        """
        return Vector(self.x * other, self.y * other, self.z * other)

    def __truediv__(self, number):
        self.x /= number
        self.y /= number
        self.z /= number
        return self

    def __rmul__(self, other):
        """
        Computes the product between a vector and a number
        """
        return self.__mul__(other)

    def norm2(self):
        """
        Computes the square of the norm of a vector
        """
        return self.x * self.x + self.y * self.y + self.z * self.z

    def norm(self):
        """
        Compute the norm of a vector
        """
        return math.sqrt(self.norm2())

    def normalize(self):
        """
        Divides each coordinate of the vector by its norm
        """
        norm = self.norm()
        if abs(norm) > 0.0001:
            self.x /= norm
            self.y /= norm
            self.z /= norm

    def cross_product(v1, v2):
        """
        Computes the cross product between the two vectors
        """
        return Vector(
            v1.y * v2.z - v1.z * v2.y,
            v1.z * v2.x - v1.x * v2.z,
            v1.x * v2.y - v1.y * v2.x)

    def from_points(v1, v2):
        """
        Creates a vector from two points
        """
        return Vector(
            v2.x - v1.x,
            v2.y - v1.y,
            v2.z - v1.z)

    def __str__(self):
        """
        Prints the coordinates of the vector between partheses
        """
        return '(' + ", ".join([str(self.x), str(self.y), str(self.z)]) + ")"

    def dot(self, other):
        """
        Computes the dot product of two vectors
        """
        return self.x * other.x + self.y * other.y + self.z * other.z