Categoría: Matemática

  • Desarrolla a la Velocidad de la Luz con Qiskit: Tu Entorno Cuántico Todo en Uno

    Desarrolla a la Velocidad de la Luz con Qiskit: Tu Entorno Cuántico Todo en Uno

    ”¿Qué

    Qiskit es una plataforma de software de código abierto, desarrollada por IBM, que permite a los desarrolladores y científicos crear y ejecutar algoritmos en computadoras cuánticas. Qiskit tiene varias herramientas, incluyendo un lenguaje de programación específico para computación cuántica, un simulador cuántico y una plataforma de ejecución en la nube para computadores cuánticos reales.

    • La plataforma está diseñada para ser accesible para programadores sin experiencia previa en computación cuántica, lo que facilita la adopción de esta tecnología.
    • Qiskit se integra con Python, un lenguaje de programación popular, permitiendo que los desarrolladores puedan usar sus conocimientos existentes y aprovechar las capacidades de Python.
    • La plataforma incluye varias bibliotecas y herramientas para optimizar y analizar algoritmos cuánticos, incluyendo métodos de programación cuántica híbrida y algoritmos de aproximación cuántica.

    ”¿Dónde

    • Optimización: Qiskit puede usarse para resolver problemas de optimización complejos, como encontrar la mejor ruta de entrega de paquetes, la mejor combinación de inversiones en un portafolio o el mejor diseño de un material nuevo.
    • Simulación cuántica: Qiskit permite simular sistemas cuánticos complejos, como moléculas o materiales, que son difíciles de modelar con computadoras clásicas.
    • Aprendizaje automático cuántico: Qiskit puede usarse para desarrollar algoritmos de aprendizaje automático cuántico, que pueden ser más rápidos y precisos que los algoritmos clásicos.
    • Química cuántica: Qiskit puede aplicarse en química cuántica para diseñar nuevos medicamentos o materiales con propiedades específicas, como fármacos más efectivos o baterías más eficientes.
    • Criptografía cuántica: Qiskit puede usarse para desarrollar algoritmos de criptografía cuántica, que son más seguros que los algoritmos clásicos y pueden proteger la información de los ataques cibernéticos.

    ”Ruta

    1. Fundamentos de computación cuántica: Aprende los conceptos básicos de la computación cuántica, como qubits, puertas y algoritmos. Ya vimos una introducción a la matemática usada en la computación cuántica.
    2. Qiskit básico: Aprende a instalar y usar Qiskit para crear y ejecutar programas cuánticos simples.
    3. Qiskit avanzado: Profundiza en temas como la optimización de circuitos, la simulación cuántica y el aprendizaje automático cuántico.
    4. Desarrollo de aplicaciones cuánticas: Aprende a desarrollar aplicaciones cuánticas para resolver problemas específicos.

    Vamos a ir probando esta ruta de aprendizaje así que no te pierdas ningún post. Suscríbete y comenta.



    честные казино с быстрыми выплатами
    бездепозитные бонусы казино
    играть в лучшем казино на деньги
    база казино с бездепозитным бонусом
    онлайн казино России
    casino oyunu

    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨


    честные казино с быстрыми выплатами
    бездепозитные бонусы казино
    играть в лучшем казино на деньги
    база казино с бездепозитным бонусом
    онлайн казино России
    casino oyunu

  • DESMITIFICANDO LOS ALGORITMOS: Calculando complejidad

    DESMITIFICANDO LOS ALGORITMOS: Calculando complejidad

    Analizar el rendimiento de un algoritmo es una parte crucial de su diseño. Para ser útil, cualquier algoritmo debe cumplir las siguientes características:

    1. Correcto: Un algoritmo debe generar resultados precisos y exactos. La verificación exhaustiva es esencial.

    2. Comprensible: No debe ser excesivamente complicado de implementar. La facilidad de comprensión facilita su aplicación práctica.

    3. Eficiente: La eficiencia es esencial para un buen algoritmo. Aunque pueda producir resultados correctos, su utilidad se ve comprometida si requiere un tiempo excesivo o una cantidad desmesurada de recursos computacionales.

    Complejidad Espacial

    El análisis de la complejidad espacial se enfoca en calcular la cantidad de memoria que un algoritmo requiere para procesar datos de entrada. Con el aumento de la informática distribuida y volúmenes crecientes de datos, este análisis se vuelve esencial. La eficiente asignación de recursos en las modernas estructuras de datos en memoria se convierte en un factor clave, especialmente en algoritmos iterativos, donde la naturaleza iterativa impacta en cómo se llenan las estructuras de datos y en los requisitos de memoria en distintas fases de ejecución.

    • En las iteraciones convergentes, la complejidad espacial disminuye a medida que el algoritmo avanza, siendo desafiante en las primeras iteraciones.
    • En las divergentes, la complejidad aumenta, y se deben establecer límites para evitar la inestabilidad.
    • En las iteraciones planas, la complejidad espacial permanece constante.

    Para calcular la complejidad espacial, se enfoca en las iteraciones más complejas, generalmente las iniciales, estimando el uso total de memoria, incluyendo estructuras de datos temporales, ejecución y valores de entrada. Este enfoque proporciona una buena estimación de la complejidad espacial del algoritmo.

    Las siguientes son pautas para minimizar la complejidad espacial:

    Computador explotando por procesar algoritmo
    1. Preferir el diseño de algoritmos como iterativos siempre que sea posible.
    2. En el diseño de algoritmos iterativos, al haber opción, optar por un mayor número de iteraciones en lugar de un menor número. Se espera que un mayor número de iteraciones más refinadas tenga una menor complejidad espacial.
    3. Los algoritmos deben traer a la memoria solo la información necesaria para el procesamiento actual, eliminando lo que no se necesita.
    4. El análisis de la complejidad espacial es esencial para el diseño eficiente de algoritmos. La falta de este análisis podría resultar en problemas de memoria insuficiente para las estructuras de datos temporales, afectando significativamente el rendimiento y eficiencia del algoritmo.

    complejidad temporal

    El análisis de la complejidad temporal estima cuánto tiempo tomará para que un algoritmo complete su tarea asignada basándose en su estructura. A diferencia de la complejidad espacial, la complejidad temporal no depende del hardware en el que se ejecutará el algoritmo, sino únicamente de su estructura. El objetivo principal del análisis de la complejidad temporal es responder a dos preguntas fundamentales:

    1. ¿Este algoritmo se adaptará a una escala mayor? Debería aprovechar la infraestructura elástica moderna de entornos de computación en la nube, utilizando más CPUs, núcleos de procesamiento, GPUs y memoria disponibles.
    2. ¿Cómo manejará este algoritmo conjuntos de datos más grandes? Es crucial evaluar cómo afecta el tamaño de los datos al rendimiento del algoritmo, asegurándose de que no solo sea preciso, sino que también pueda escalar eficientemente, especialmente en el contexto actual de “big data”.

    Para alcanzar este objetivo, dado un problema y múltiples algoritmos, debemos determinar cuál es el más eficiente en términos de tiempo. Se pueden emplear dos enfoques básicos para calcular la complejidad temporal:

    1. Enfoque de perfilado post-implementación: Se implementan diferentes algoritmos candidatos y se compara su rendimiento.
    2. Enfoque teórico pre-implementación: Se aproxima matemáticamente el rendimiento de cada algoritmo antes de ejecutarlo.

    La ventaja del enfoque teórico es que depende solo de la estructura del algoritmo, prescindiendo del hardware real, la pila de software seleccionada en tiempo de ejecución o el lenguaje de programación utilizado para implementar el algoritmo.

    Calculando la complejidad

    El rendimiento de un algoritmo típico depende del tipo de datos que recibe como entrada. Para abordar esta dependencia, se analizan distintos casos en el análisis de rendimiento:

    1. Mejor caso: Considera el escenario donde los datos de entrada están organizados de manera que el algoritmo ofrece su mejor rendimiento. Proporciona un límite superior de rendimiento.

    2. Peor caso: Estima el tiempo máximo que tomará realizar la tarea bajo condiciones específicas. Útil para garantizar un rendimiento mínimo en cualquier situación. Proporciona un límite inferior de rendimiento.

    3. Caso promedio: Divide las posibles entradas en grupos, realiza análisis de rendimiento en una entrada representativa de cada grupo y calcula el promedio del rendimiento de cada grupo. El análisis del caso promedio no siempre es preciso, ya que implica considerar todas las combinaciones posibles de entradas, lo cual puede ser complicado.

    Notación Big O

    La notación Big O indica el número de operaciones que procesará un algoritmo en lugar de mostrar el tiempo exacto de ejecución. Su objetivo es mostrar la tasa de crecimiento de un algoritmo y facilitar la comparación con otros algoritmos en términos de eficiencia.

    Reglas para la notación Big-O:

    1. La complejidad de un bucle en un algoritmo, que realiza una secuencia de pasos n veces, es O(n).

    2. Para bucles anidados, si un algoritmo realiza una función con un bucle de n^1 pasos y, para cada bucle, realiza otro de n^2 pasos, la complejidad total del algoritmo es O(n^1 × n^2).

    3. Si un algoritmo realiza una función f(n) que toma n^1 pasos y luego realiza otra función g(n) que toma n^2 pasos, la complejidad total del algoritmo es O(f(n)+g(n)).
    4. Si un algoritmo tiene una complejidad de O(g(n) + h(n)) y g(n) es mayor que h(n) para valores grandes de n, la complejidad se simplifica a O(g(n)).
      • Ejemplo: O(1+n) = O(n), y O(n2 + n3) = O(n2).
    5. Al calcular la complejidad de un algoritmo, se ignoran los múltiplos constantes.

    Complejidad en tiempo constante

    (O(1))Ejemplo: Añadir, obtener elemento, establecer elemento

    Si un algoritmo tarda la misma cantidad de tiempo en ejecutarse, independientemente del tamaño de los datos de entrada, se dice que se ejecuta en tiempo constante. Tomemos el ejemplo de acceder al enésimo elemento de un array. Independientemente del tamaño del array, llevará un tiempo constante obtener los resultados.

    Complejidad en tiempo lineal

    O(n)Ejemplo: Copiar, insertar, eliminar, iteración

    Un algoritmo se considera tener una complejidad de tiempo lineal, si el tiempo de ejecución es directamente proporcional al tamaño de la entrada. Un ejemplo simple sería sumar los elementos en una estructura de datos unidimensional.

    Complejidad en tiempo cuadrático

    O(n^2)Ejemplo: Bucles anidados

    Un algoritmo se considera que se ejecuta en tiempo cuadrático si el tiempo de ejecución del algoritmo es proporcional al cuadrado del tamaño de la entrada; por ejemplo, una función simple que suma los elementos de un array bidimensional.

    Complejidad en tiempo logarítmico

    O(logn)Ejemplo: Encontrar un elemento en una matriz ordenada

    Un algoritmo se considera que se ejecuta en tiempo logarítmico si el tiempo de ejecución es proporcional al logaritmo del tamaño de la entrada. Con cada iteración, el tamaño de la entrada disminuye por factores múltiplos constantes. Un ejemplo de un algoritmo logarítmico es la búsqueda binaria. Este algoritmo se utiliza para encontrar un elemento específico en una estructura de datos unidimensional, como en una lista en Python, siempre y cuando los elementos estén ordenados en orden descendente.

    Estas son las bases matemáticas para calcular la complejidad de un algoritmo, si tienes dudas o quieres que ahondemos en alguno de estos temas, deja tu comentario. Hasta la próxima.


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

  • Conceptos matemáticos de Deeplearning

    Conceptos matemáticos de Deeplearning

    Como vimos en el anterior post, a medida que vamos agregando complejidad a las operaciones necesitamos agregar capas ocultas, estas capas nos van a permitir detectar patrones y correlaciones; cada neurona se va a especializar en un patrón, es decir, se activara cuando reconozca ese patrón o relación, como una compuerta lógica.

    Pero antes de continuar veamos a pequeña escala en que fundamentos matemáticos se basa para crear estos patrones y en que consiste el entrenamiento, para esto vamos a utilizar la pequeña red que habíamos mostrado para ejemplificar una compuerta de tipo XOR. Otra pequeña aclaración es que solo vamos a ver los aspectos fundamentales del entrenamiento, aclaro esto ya que a medida que avancemos vamos a ir robusteciendo estas bases agregando hiperparámetros y otros procesos a medida que sea necesarios.

    Forward propagation

    La propagación hacia adelante consiste en tomar los valores de entrada para validar que neuronas se activan hasta llegar a la capa de salida. Suena fácil, pero vamos a complicarlo un poquito viendo que pasa en detalle por cada una de estas capas.

    Estamos muy acostumbrados a ver redes neuronales gigantes, con muchos hiperparámetros y entradas, pero claramente para aprender es mas conveniente trabajar con pocas entradas, por lo que vamos a crear nuestra pequeña red neural.

    Tenemos nuestras entradas definidas por la variable x_i, estas van a interactuar con nuestras primeras neuronas, recordemos que el valor que va a llegar a la siguiente neurona esta determinado por \sum w_ix_i+b ¿De donde salen los valores para w y b? Pues en nuestra primera iteración estos valores son generados para toda la red aleatoriamente, es decir que claramente nuestra predicción \hat{y} va ser errónea, pero eso lo iremos ajustando.

    Por ahora sabemos que llega un valor a nuestra neurona y esta debe decidir si se activa o no, es decir que debemos darle un umbral de decisión, aquí es donde nos apoyamos de nuestra función de activación. Una función de activación nos va a servir para determinar si el valor recibido cumple y puede continuar a la siguiente capa, a esto lo consideramos una activación.

    Aquí te dejo una lista de las funciones mas usadas. Actualmente la mas utilizada es la ReLU.

    Este proceso lo vamos a hacer por cada neurona, las salidas activación de nuestras neuronas serán la entrada en nuestra siguiente capa.

    En las capas ocultas lo mas probable es que tengamos funciones de activación ReLU, estas son muy comunes ya que todo lo que sea menor a 0 lo deja como 0 y estandariza el resto de valores entre 0 y 1. Sin embargo, para nuestra neurona de salida utilizamos una función de activación diferente y esto depende del tipo de problema en el que estemos trabajando. Por ejemplo, para una predicción de tipo regresión utilizamos una función linear, para un problema de clasificación usaremos la función softmax para casos de selección múltiple y la función sigmoide para clasificación binaria(una sola neurona a la salida).

    Una vez tenemos nuestra predicción \hat{y} podemos continuar con nuestro siguiente paso.

    Ground truth y cálculo del error

    El Ground truth hace referencia al resultado ideal esperado. Es nuestro punto de referencia para validar que tan precisas son nuestras estimaciones, por lo que inmediatamente la podemos asociar con nuestro set de datos de entrenamiento, es decir, el Ground truth esta formado por todas las mediciones de datos que se han recopilado para el entrenamiento.

    Vamos a empezar por calcular el error E, que en este caso será un medio por la diferencia al cuadrado del Ground truth y menos la predicción \hat{y}. Sin embargo recordar que tenemos diferentes opciones para calcular el error.

    Backpropagation

    Al iniciar el proceso se mencionó que los pesos entre neuronas se da aleatoriamente y es de esperar que el error sea alto; una vez tenemos ese error calculado debemos devolvernos y comunicar el valor del error para ajustar los pesos. El ajuste de pesos lo hacemos calculando la derivada parcial de la función aplicada, analizamos como varia el error en función de los pesos.

    Tenemos que utilizar una medida de learning rate  \eta (taza de aprendizaje), que me va a modular que tanto cambio los pesos, ya que la idea no es cambiarlos bruscamente si no que se dibuje una curva suave en donde se muestre como disminuye el error para alcanzar la convergencia.

    Veamos como seria el calculo del nuevo peso para la primera neurona en retro propagación.

    w_{1,1}^{2}(t+1)=w_{1,1}^{2}(t)-\eta \frac{\partial E}{\partial w_{1,1}^{2}}

    Lo que estamos indicando es que el peso para esa neurona en nuestra siguiente iteración t, es igual peso que tiene actualmente, menos el learning rate   \eta por la variación del peso con respecto al error.

    Este proceso se debe aplicar para cada uno de los pesos de la neurona, sin embargo, no se pueden calcular los pesos individualmente, ya que los pesos de una capa anterior influye en los pesos de la capa actual. Para solventar esto debemos calcular los pesos con la regla de la cadena, quedándonos la derivada de w_{1,1}^{2}(t+1) de la siguiente manera:

    \frac{\partial E}{\partial w_{1,1}^{2}}=\frac{\partial E}{\partial a_{1}^{3}}\cdot \frac{{\partial a_{1}^{3}}}{\partial Z_{1}^{3}}\cdot \frac{{\partial Z_{1}^{3}}}{\partial W_{1,1}^{2}}

    Finalmente podemos aplicar los cambios requeridos para ajustar cada neurona y así se repite este proceso iterativamente hasta hacer que nuestros valores deseados sean lo mas cercanos posible.


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

  • Introducción lógica borrosa

    Introducción lógica borrosa

    Conceptos básicos

    Dato: Representación parcial o total de algo. Tenemos diferentes tipos de datos. Suelen almacenarse en un datalake(repositorio de datos diversos en bruto) para extraer información.

    Información: conjunto de datos, Aprovechamiento inteligente de datos masivos.

    Conocimiento: Reglas aplicadas a los datos o información. Abstracción o patrones de un algo. Es la base del sistema de inteligencia de negocio.

    • Sistemas de ayuda a la decisión
    • Sistemas de recomendación
    • Análisis de series temporales (predicción(estimación) y pronostico(hecho puntual, sigue una tendencia))

    Tipos básicos de analítica de datos

    • Descriptivo: Describe que ocurrió o esta ocurriendo
    • Diagnostico: Indaga las causas de lo que esta ocurriendo y valida que evidentemente ocurre lo que se afirma que esta sucediendo.
    • Descubrimiento
    • Predictivo: ¿Qué es lo mas probable que ocurre?
    • Prescriptivo ¿Qué es lo mejor que se puede hacer?

    SOFTComputing

    Asociación de diferentes técnicas, donde cada una aporta desde su campo fuerte, los principales componentes son:

    • Lógica borrosa
    • Redes neuronales
    • Razonamiento probabilístico (redes de creencias)
    • Algoritmos genéticos
    • Teoría del caos
    • Teoría de aprendizaje

    Ingeniería del conocimiento

    Se encarga de analizar, pulir y extraer información de los datos por medio de sistemas expertos.

    Abducción: Razonamiento aproximado.

    Deducción: Inducción de los ejemplos a la generalización.

    Correlación a causalidad (Razonamiento por analogía)

    • Una causa tiene una relación con un efecto
    • Una causa puede tener una relación de similitud con otra causa, por ejemplo la gripe SARS tiene una relación de similitud con el Covid, por lo que podemos crear una relación para estimar los efectos.

    Conjunto clásico o CRISP

    Un conjunto es una lista, también lo podemos especificar a través de propiedades o reglas, por ejemplo el conjunto de los números pares.

    La función de característica indica si un elemento hace parte o no de un conjunto.

    El numero de elementos que pertenece a un conjunto A se llama cardinalidad del conjunto |A|

    La familia de conjuntos que incluye todos los subconjuntos de un conjunto se denomina conjunto potencia. El numero de elementos del conjunto potencia será: |P(A)|=2^{|A|}

    Lógica borrosa

    Proporciona bases para el razonamiento aproximado, incluye:

    • Predicados borrosos(caro, alto, raro, peligroso, …)
    • Cuantificadores borrosos (mucho, parecido, casi todo, …)
    • Valores de verdad borrosos (muy cierto, mas o menos cierto, …)
    • Cercas semánticas (muy, algo, …)
    Conjunto CRISP vs conjunto borroso
    Conjunto CRISP vs conjunto borroso

    El soporte de un conjunto borroso A es el conjunto crisp que contiene todos los elementos del domino que tienen un grado de pertenencia no nulo en A.

    Altura de un conjunto borroso es el mayor grado de pertenencia que tiene cualquiera de los elementos del conjunto borroso.

    Núcleo de un conjunto borroso es el conjunto de elementos del soporte que tienen el máximo grado de pertenencia al conjunto borroso.

    Un conjunto borroso es normalizado cuando al menos uno de sus elementos alcanza el grado de pertenencia 1.

    \alpha-corte de un conjunto borroso A es un conjunto crisp que contiene todos los elementos de conjunto universal X que que tienen un grado de pertenencia en A mayor o igual que el valor \alpha.

    Conjunto nivel de un conjunto borroso A es el conjunto de sus distintos \alpha-cortes o niveles \Alpha\in[0,1].

    Cardinalidad escalar de un conjunto borroso A definido en un conjunto de universo finito se define como la suma de los grados de pertenencia de todos los elementos del dominio en A

    \left|A\right|=\sum_{x\in X}\mu_A(x)

    Cardinalidad borrosa es un conjunto borroso cuya función de pertenencia se define como:

     \mu_{\left|{A}' \right|}(\left|A_\alpha\right|)=\sum_{i=1,n}\alpha_i/n_i

    Indica cuantos elementos quedan por encima de un \alpha-corte.

    Un conjunto borroso A es convexo sí y solo sí cada uno de sus \alpha-cortes es un conjunto convexo en sentido crisp.

    Número borroso es un conjunto borroso convexo y normalizado cuya función de pertenencia es continua.

    Ejemplo número borroso 0
    Ejemplo número borroso 0

    Operadores

    Or \vee=\cup Unión

    And \wedge=\cap Intersección

    Implica \to=\subseteq Inclusión

    Negación \lnot A=\tilde{A} Complementario

  • Introducción estadística

    Introducción estadística

    Conceptos básicos

    • Población: Conjunto del cual se quiere extraer características.
    • Muestra: Subconjunto de la población. Es muy importante que este conjunto represente la población, es decir que involucre sus particularidades y características.
    • Inferencia estadística: Proceso para obtener conclusiones de una población a partir de un análisis sobre una muestra.
    • Variable(atributo): Representa el valor de una cualidad de una población, este valor puede variar de registro a registro.
      • Ordinales: No numéricas en la que existe un criterio de orden.
      • Nominales: No numérico y no admiten criterio de orden.
      • Discretas: Toman un número finito de valores, son contables.
      • Continuas: Toman un número infinito de valores en un rango continuo.

    Análisis de variables cualitativas

    Podemos usar una tabla de frecuencias para resumir y facilitar la comprensión de los datos. Esta tabla simplemente consiste en tener cada uno de los valores que puede tomar la variable y la cantidad de repeticiones(frecuencia) que hay en los datos.

    Otra manera, que a mi particularmente me gusta mucho es representar el análisis por medio de gráficos de por ejemplo pie o barras(hay muchos mas). Estos permiten comprender los datos de manera muy visual y fácil, y te da una ventaja al momento de exponer sobre el tema. Tienen una facilidad tremenda de ser comprendidos y causan un impacto a nivel profesional muy bueno.

    Análisis de variables cuantitativas

    Podemos usar medidas de tendencia central:

    • Media
      \bar{x}=\frac{1}{N}\sum_{i=1}^{N}x_i
    • Mediana
      Impar, \bar{x} es el valor en la posición \frac{N}{2}
      Par, \bar{x}=\frac{1}{2}(X\begin{bmatrix}\frac{N}{2}\end{bmatrix}+X\begin{bmatrix}\frac{N}{2}+1\end{bmatrix})
    • Moda
      Valor mas repetido en el conjunto de datos X

    Medidas de posición como en el diagrama de caja y bigotes.

    Medidas de dispersión:

    Medidas de distribución:

    • Coeficiente de asimetría
      Mide la simetría de la distribución de una variable respecto a la media aritmética
      A=\frac{\sum_{i=1}^{N}(x_i-\bar{x})^3}{N\cdot \sigma^3}
    • Curtosis
      Mide el grado de apuntamiento o achatamiento de la distribución de frecuencia respecto a una distribución normal
      K=\frac{\sum_{i=1}^{N}(x_i-\bar{x})^4}{N\cdot \sigma^4}-3
  • Fundamentos matemáticos para la computación cuántica

    Fundamentos matemáticos para la computación cuántica

    Números complejos

    Los números complejos \mathbb C puede representarse como la suma de un número real y un número imaginario.

    a = a_{r}+ia_{i}, con  i=\sqrt{-1} y:

    • a_{r} componente real, a_{r} = \Re (a)
    • a_{i} componente imaginaria, a_{i} = \Im (a)

    Operaciones con complejos

    Suma

    a+b=(a_{r}+b_{r})+i(a_{i}+b_{i})\in \mathbb{C}

    Producto

    Recordemos que i^{2}=-1

    ab=(a_{r}+ia_{i})(b_{r}+ib_{i})=(a_{r}b_{r}-a_{i}b_{i})+i(a_{r}b_{i}+a_{i}b_{r})\in \mathbb{C}

    Conjugado

    El conjugado se obtiene cambiando el signo de su componente imaginaria.

    \bar{a}=a_r-ia_i o a^*=a_r-ia_i

    • La conjugación del denominador complejo juega el mismo papel que la racionalización de un denominador irracional. Se busca que el denominador sea real.
    • Facilita la división de números complejos, pues al conjugar el denominador, el cociente se transforma en un producto del dividendo por el inverso multiplicativo del divisor.
    • Permite calcular el módulo de cualquier número complejo.

    Norma(Módulo)

    Es el número real positivo que mide su tamaño y generaliza el valor absoluto de un número real. Esta noción es particularmente útil para definir una distancia en el plano complejo.

    |a|^2=a^*a=(a_r-ia_i)(a_r+ia_i)=a_r^2+ia_ra_i-ia_ia_r+a_i^2=a_r^2+a_i^2

    \Rightarrow |a|=+\sqrt{a_r^2+a_i^2}\in \mathbb{R}

    División

    \frac{a}{b}=\frac{ab^*}{bb^*}

    =\frac{(a_r+ia_i)(b_r-ib_i)}{|b|^2}

    =\frac{(a_rb_r+a_ib_i)+i(a_ib_r-a_rb_i}{|b|^2}\in \mathbb{C}

    Forma polar

    Podemos representar los números complejos como puntos en el plano, cada punto del plano se determina por una distancia y un ángulo.

    Esta forma de representar los números complejos es ampliamente utilizada en física y trigonometría, ya que es normalmente mucho más simple trabajar con números complejos expresados en forma polar que con su equivalente en forma rectangular(forma que vimos anteriormente).

    Formula de Euler: e^{i\theta} = \cos\theta + i\sin\theta con \theta\in \mathbb{R} denominada fase.

    Nótese que en esta fórmula, al igual que en todas aquellas en las que intervienen exponenciales de ángulos, se asume que el ángulo θ está expresado en radianes.

    Veamos algunas operaciones con forma polar:

    Sean a,b \in \mathbb{C}, a=|a|e^{i\theta}, b=|b|e^{i\varphi}, con |a|, |b|, \theta, \varphi \in \mathbb{R}

    Ilustración de un número complejo en el plano complejo usando la fórmula de Euler

    Producto

    a b = |a||b|e^{i(\theta+\varphi)} = |ab| (\cos(\theta+\varphi)+i\sin(\theta+\varphi))

    Conjugado

    a^* = |a|e^{-i\theta} = |a| (\cos\theta - i\sin\theta)

    División

    \frac{a}{b} = \frac{|a|}{|b|}e^{i(\theta-\varphi)} = \frac{|a|}{|b|}(\cos(\theta-\varphi)+i\sin(\theta-\varphi))

    Potencia

    a^n = |a|^ne^{in\theta} = |a|^n (\cos(n\theta) - i\sin(n\theta))

    Exponenciación

    e^{(x+yi)} = e^xe^{iy} = e^x(\cos(y)+i\sin(y))

    Raíces

    \sqrt[n]{a} = a^\frac{1}{n} = |a|^\frac{1}{n}e^{i\frac{\theta+2k\pi}{n}}

    Hagamos unas operaciones para sacar la norma y la fase con la forma polar.

    Espacio de Hilbert

    Es una generalización del concepto de espacio euclídeo. Esta generalización extiende los métodos del álgebra lineal y el cálculo aplicados en el espacio euclídeo de dos dimensiones y tres dimensiones a los espacios de dimensión arbitraria, incluyendo los espacios de dimensión infinita.

    El estado de un sistema cuántico viene descrito por un vector (vector de estado) en un espacio de Hilbert de componentes complejas.
    Espacio vectorial complejo: conjunto no vacío de elementos, denominados vectores, que incluye las operaciones de suma, negación y multiplicación por un escalar
    Los vectores se representan como arrays de 𝑛 filas y 1 columna.

    \vec{v}=\begin{bmatrix} v_0\\ v_1\\ \vdots \\ v_{n-1} \end{bmatrix}

    v_i\in \mathbb{C} y n es la dimensión del espacio.

    El espacio \mathbb{V} = \mathbb{C}^2 formado por los vectores de 2 elementos complejos con producto escalar es un espacio de Hilbert.

    Notación de Dirac(bra-ket)

    Es la notación estándar para describir los estados cuánticos, también se utiliza para denotar vectores abstractos y funcionales lineales en matemática.

    El estado de un sistema físico se identifica con un vector en el espacio de Hilbert complejo, . Cada vector se llama un ket, y se denota como . Cada ket tiene un bra dual, escrito como , esto es una funcional lineal continua de a los números complejos C.

    Ket: |\,\rangle

    Bra: \langle\,|

    |v\rangle = \begin{bmatrix} v_0 \\ v_1\\ \vdots \\v_{n-1} \end{bmatrix}

    \langle v| = (|v\rangle)^\dagger = \begin{bmatrix} v_0^* & v_1^* & \cdots & v_{n-1}^* \end{bmatrix}

    donde el símbolo \dagger representa la matriz traspuesta conjugada

    Producto escalar o interno

    Se utiliza para determinar si dos vectores son ortogonales.

    Sean |u\rangle y |v\rangle vectores de dimensión n.

    \langle v|u\rangle = \begin{bmatrix} v_0^* & v_1^* & \cdots & v_{n-1}^* \end{bmatrix}\cdot \begin{bmatrix} u_0 \\ u_1\\ \vdots \\u_{n-1} \end{bmatrix} = v_0^*u_0 + v_1^*u_1 + \cdots + v_{n-1}^*u_{n-1} \in \mathbb{C}

    Módulo(Norma)

    \lVert|v\rangle\|^2 = \langle v|v\rangle = v_0^*v_0 + v_1^*v_1 + \cdots + v_{n-1}^*v_{n-1}

     =|v_0|^2 + |v_1|^2 + \cdots + |v_{n-1}|^2 \in \mathbb{R}

     

    Esta norma es siempre positiva

    \||v\rangle\|\ge 0$, y $\||v\rangle\|= 0\Leftrightarrow |v\rangle = 0

    Propiedades del producto interno

    • Linealidad por la izquierda:- \langle (\alpha v+\beta w)|u\rangle = \alpha\langle v|u\rangle+\beta\langle w|u\rangle con \alpha,\beta \in \mathbb{C}
    • Linealidad conjugada por la derecha: \langle v|(\alpha u+\beta w)\rangle = \alpha^*\langle v|u\rangle+\beta^*\langle v|w\rangle con \alpha,\beta \in \mathbb{C}
    • Hermiticidad: \langle v|u\rangle = (\langle u|v\rangle)^*

    Producto externo (outer product)

    Se usa para probar si dos vectores son paralelos.

    El producto externo de dos vectores de dimensión n es una matriz de dimensión n\times n

    |u\rangle\langle v| = \begin{bmatrix} u_0 \\ u_1\\ \vdots \\u_{n-1} \end{bmatrix}\cdot \begin{bmatrix} v_0^* & v_1^* & \cdots & v_{n-1}^* \end{bmatrix}= \begin{bmatrix} u_0v_0^* & u_0v_1^* & \cdots & u_0v_{n-1}^*\\ u_1v_0^* & u_1v_1^* & \cdots & u_1v_{n-1}^*\\ \vdots & \vdots & \ddots & \vdots\\ u_{n-1}v_0^* & u_{n-1}v_1^* & \cdots & u_{n-1}v_{n-1}^*\\ \end{bmatrix}

    Propiedades del producto externo

    • |u\rangle\langle v| = (|v\rangle\langle u|)^\dagger
    • (|u\rangle + |v\rangle)(\langle w|+\langle x|)
      = |u\rangle(\langle w|+\langle x|)+|v\rangle(\langle w|+\langle x|)
      = |u\rangle\langle w|+|u\rangle\langle x|+|v\rangle\langle w|+|v\rangle\langle x|
    • \alpha(|u\rangle\langle v|) = (\alpha|u\rangle)\langle v|
      = |u\rangle(\alpha\langle v|) con \alpha\in \mathbb{C}
    • (|u\rangle\langle v|)|w\rangle
      = |u\rangle(\langle v|w\rangle)
      = (\langle v|w\rangle)|u\rangle ya que \langle v|w\rangle es un escalar

    Producto tensor (Kronecker)

     

    Denotado con \otimes, a una operación sobre dos matrices de tamaño arbitrario que da como resultado una matriz bloque. Es un caso especial del producto tensorial. El producto de Kronecker no debería confundirse con el producto de matrices habitual, que es una operación totalmente diferente.

    El producto tensor de un vector |u\rangle de m elementos y un vector |v\rangle de n elementos es un vector de m\cdot n elementos dado por:

    |u\rangle\otimes|v\rangle \equiv |u\rangle|v\rangle \equiv |uv\rangle = \begin{bmatrix} u_0 \begin{bmatrix} v_0 \\ v_1\\ \vdots \\v_{n-1} \end{bmatrix}\\ u_1 \begin{bmatrix} v_0 \\ v_1\\ \vdots \\v_{n-1} \end{bmatrix}\\ \vdots\\ u_{m-1} \begin{bmatrix} v_0 \\ v_1\\ \vdots \\v_{n-1} \end{bmatrix} \end{bmatrix} = \begin{bmatrix} u_0v_0\\ u_0v_1\\ \vdots\\ u_0v_{n-1}\\ u_1v_0\\ u_1v_1\\ \vdots\\ u_1v_{n-1}\\ \vdots\\ u_{m-1}v_0\\ u_{m-1}v_1\\ \vdots\\ u_{m-1}v_{n-1}\\ \end{bmatrix}

     

    Ejemplo:

    Sean, en un espacio de dimensión 2, los siguientes vectores:

    |0\rangle = \begin{bmatrix}1 \\ 0\end{bmatrix}, \quad |1\rangle =\begin{bmatrix}0 \\ 1\end{bmatrix} \\ |0\rangle\otimes |0\rangle \equiv |00\rangle = \begin{bmatrix}1 \\ 0\end{bmatrix}\otimes \begin{bmatrix}1 \\ 0\end{bmatrix} = \begin{bmatrix}1 \\ 0 \\ 0 \\ 0\end{bmatrix}\\ |0\rangle\otimes |1\rangle \equiv |01\rangle = \begin{bmatrix}1 \\ 0\end{bmatrix}\otimes \begin{bmatrix}0 \\ 1\end{bmatrix} = \begin{bmatrix}0 \\ 1 \\ 0 \\ 0\end{bmatrix}\\ |1\rangle\otimes |0\rangle \equiv |10\rangle = \begin{bmatrix}0 \\ 1\end{bmatrix}\otimes \begin{bmatrix}1 \\ 0\end{bmatrix} = \begin{bmatrix}0 \\ 0 \\ 1 \\ 0\end{bmatrix}\\ |1\rangle\otimes |1\rangle \equiv |11\rangle = \begin{bmatrix}0 \\ 1\end{bmatrix}\otimes \begin{bmatrix}0 \\ 1\end{bmatrix} = \begin{bmatrix}0 \\ 0 \\ 0 \\ 1\end{bmatrix}\\

    Propiedades del producto tensor

    • Asociatividad y traspuesta:
      • |u\rangle\otimes (|v\rangle+|w\rangle) = |u\rangle\otimes |v\rangle+|u\rangle\otimes |w\rangle
      • (|v\rangle+|w\rangle)\otimes |u\rangle = |v\rangle\otimes |u\rangle+|w\rangle\otimes |u\rangle
      • (|u\rangle\otimes |v\rangle)\otimes |w\rangle = |u\rangle\otimes (|v\rangle \otimes |w\rangle)
      • (|u\rangle\otimes |v\rangle)^\dagger = |u\rangle^\dagger \otimes |v\rangle^\dagger
      • (\alpha|u\rangle)\otimes |v\rangle = |u\rangle\otimes (\alpha|v\rangle) = \alpha(|u\rangle\otimes |v\rangle), con \alpha\in \mathbb{C}
    • No-conmutatividad (en general):
      |u\rangle \otimes |v\rangle \neq |v\rangle\otimes |u\rangle
    • Propiedad del producto mixto:
      (|u\rangle\otimes |v\rangle)(\langle w|\otimes \langle x|) = |u\rangle \langle w|\otimes |v\rangle\langle x|

    Producto tensor de espacios vectoriales

    Dado un espacio vectorial \mathbb{V} de dimensión n y otro \mathbb{V}^\prime de dimensión n^\prime, el espacio vectorial \mathbb{V}\otimes \mathbb{V}^\prime tiene dimensión n\cdot n^\prime y se define como:

    \mathbb{V}\otimes \mathbb{V}^\prime = \{v\otimes v^\prime | v\in \mathbb{V}, v^\prime\in \mathbb{V}^\prime\}

    Base del espacio

    Un conjunto de n vectores es una base del espacio de dimensión n si se verifica:

    • Cualquier vector |v\rangle se puede escribir como una combinación lineal de los elementos de la base.
    • Los vectores de la base son linealmente independientes

    Si, además, los vectores de la base son ortogonales (ortonormales), se dice que la base es ortogonal (ortonormal).

    Ejemplo

    Sean los siguientes vectores de n elementos:

    |0_n\rangle = \begin{bmatrix} 1 \\ 0 \\ 0 \\ \vdots \\0 \end{bmatrix},\quad |1_n\rangle = \begin{bmatrix} 0 \\ 1 \\ 0 \\ \vdots \\0 \end{bmatrix},\quad |2_n\rangle = \begin{bmatrix} 0 \\ 0 \\ 1 \\ \vdots \\0 \end{bmatrix},\ldots, |(n-1)_n\rangle = \begin{bmatrix} 0 \\ 0 \\ 0 \\ \vdots \\1 \end{bmatrix}

    es decir, el vector |i_n\rangle tiene sus n coeficientes a 0 excepto el i-ésimo que vale 1.

    El conjunto \{|0_n\rangle,|1_n\rangle,|2_n\rangle,\ldots,|(n-1)_n\rangle\} es una base ortonormal (llamada base canónica).

    |v\rangle = \begin{bmatrix} v_0 \\ v_1\\ \vdots \\v_{n-1} \end{bmatrix} = v_0|0_n\rangle+v_1|1_n\rangle+v_2|2_n\rangle+\cdots+v_{n-1}|(n-1)_n\rangle

    Se verifica que los vectores de la base son ortonormales, ya que:

    \langle i|j\rangle = \delta_{ij} = \begin{cases} 1 & \text{si } i = j\\ 0 & \text{si } i \neq j \end{cases}

     

    Ejemplo: cambio de base

    Sea un espacio de dimensión 2. Un vector |v\rangle escrito en la base canónica \{|0\rangle,|1\rangle\} queda:

    |v\rangle = \begin{bmatrix} v_0 \\ v_1 \end{bmatrix} = v_0 \begin{bmatrix} 1 \\ 0 \end{bmatrix} + v_1 \begin{bmatrix} 0 \\ 1 \end{bmatrix} = v_0|0\rangle + v_1|1\rangle

    Otra base es la formada por los siguientes vectores:

    |+\rangle = \begin{bmatrix} 1 \\ 1 \end{bmatrix},\quad |-\rangle = \begin{bmatrix} 1 \\ -1 \end{bmatrix}

    En esta otra base, el vector tendrá otros componentes:

    |v\rangle = v_0^\prime|+\rangle + v_1^\prime|-\rangle

    Tenemos, entonces:

    |v\rangle = v_0^\prime|+\rangle + v_1^\prime|-\rangle = v_0^\prime \begin{bmatrix} 1 \\ 1 \end{bmatrix} + v_1^\prime \begin{bmatrix} 1 \\ -1 \end{bmatrix} = \begin{bmatrix} v_0^\prime + v_1^\prime \\ v_0^\prime - v_1^\prime \end{bmatrix} = (v_0^\prime + v_1^\prime)|0\rangle + (v_0^\prime - v_1^\prime)|1\rangle

    Es decir:

    \begin{aligned} v_0 = v_0^\prime + v_1^\prime\\ v_1 = v_0^\prime - v_1^\prime \end{aligned}

    Si definimos la matriz H como:

    H = \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix}

    es fácil comprobar que:

    \begin{bmatrix} v_0 \\v_1 \end{bmatrix} = H \begin{bmatrix} v_0^\prime \\v_1^\prime \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} \begin{bmatrix} v_0^\prime \\v_1^\prime \end{bmatrix} = \begin{bmatrix} v_0^\prime + v_1^\prime \\v_0^\prime - v_1^\prime \end{bmatrix}

    H es una matriz de cambio de base: permite obtener los coeficientes en una base a partir de los coeficientes en la otra.

    Los vectores \{|+\rangle,|-\rangle\} son ortogonales, pero no son ortonormales:

    \begin{aligned} \langle +|-\rangle = \langle -|+\rangle = 0\\ \langle +|+\rangle = \langle -|-\rangle = 2 \end{aligned}

    Para que sean ortonormales, debemos definirlos como:

    |+\rangle = \tfrac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ 1 \end{bmatrix},\quad |-\rangle = \tfrac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ -1 \end{bmatrix}

    y escribir la matriz H como:

    H = \tfrac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} = \begin{bmatrix} \tfrac{1}{\sqrt{2}} & \tfrac{1}{\sqrt{2}} \\ \tfrac{1}{\sqrt{2}} & -\tfrac{1}{\sqrt{2}} \end{bmatrix}

    Esta matriz se denomina matriz de Hadamard, sus entradas son +1 o -1 y cuyas filas son mutuamente ortogonales.

    Operadores lineales y matrices

    Sea \mathbb{V} y \mathbb{U} espacios de dimensiones n y m, respectivamente.

    Un operador lineal O: \mathbb{V}\longrightarrow\mathbb{U} es una función que verifica:

    O(\alpha|v\rangle + \beta|v^\prime\rangle) = \alpha O(|v\rangle) + \beta O(|v^\prime\rangle)

    para todo |v\rangle,|v^\prime\rangle\in \mathbb{V} y \alpha, \beta \in \mathbb{C}

    El operador O se representa mediante una matriz de dimensión m\times n y la operación O(|v\rangle) es un producto matriz-vector.

    Por ejemplo, la matriz de Hadamard es un operador H: \mathbb{V}\longrightarrow\mathbb{V} con \mathbb{V} de dimensión 2.

¡Hola a todos los entusiastas de la tecnología! Quería informarles que en mi blog utilizamos cookies para mejorar la experiencia de usuario. Estas pequeñas herramientas nos ayudan a personalizar el contenido y ofrecer funciones específicas. Al continuar explorando el sitio, aceptas nuestro uso de cookies. Puedes obtener más información sobre cómo las utilizamos en nuestra política de privacidad. ¡Gracias por ser parte de esta comunidad tecnológica! 🍪    Más información
Privacidad