Javier's profileC^2 de Kernel83PhotosBlogListsMore ![]() | Help |
C^2 de Kernel83Y pensar q todos nos reímos cuando él dijo "y el diagrama de Hasse para partes de {1,2,3}, ¿es un cubo?". En la cara! |
||||||||||||||||
|
3/23/2009 Algoritmo de dado perfecto (porque es cuántico).Me refiero al "dado", ese cuerpo con seis caras y en forma de cubo, je. ¿Cómo podríamos utilizar las propiedades de la física cuántica para simular el lanzamiento de un dado perfecto? Con "perfecto" me refiero a que al lanzarlo exista la misma probabilidad (16,7% aprox.) de que salga cualquier cara. Bueno... mi código está en BASIC porque el código para el simulador está en BASIC... disculpen aquellos NO simpatizantes de este lenguaje... incluido Dijkstra, que en paz descanse. ADVERTENCIA!: el código a continuación sólo puede ser correctamente interpretado por programadores con conocimientos de computación cuántica, sorry 'Dado perfecto (porque es cuántico)! Function PerfectDice() As Byte Dim qin(0 To 2) As ptrQubit Dim V As quOperation Dim a As Double, b As Double 'Matriz de rotación correspondiente... a = 1 / Sqr(3) b = Sqr(Abs(a * a - 1)) V.a11 = cpxCreate(b, 0) V.a12 = cpxCreate(a, 0) V.a21 = cpxCreate(a, 0) V.a22 = cpxCreate(-b, 0) 'Creo el sistema... qusys_create 3 'Pido memoria... qin(0) = qubit_alloc() qin(1) = qubit_alloc() qin(2) = qubit_alloc() 'Rotación... qubit_had qin(0) qubit_had qin(1) qubit_u qin(2), V 'reg = (sqr(0.66)*|0> + sqr(0.33)*|1>) 1/sqr(2)*(|0> + |1>) 1/sqr(2)*(|0> + |1>) 'Última compuerta después de medir... Select Case qusys_measure Case 0: PerfectDice = 1 Case 1: PerfectDice = 2 Case 2: PerfectDice = 3 Case 3: PerfectDice = 4 Case 4: PerfectDice = 5 Case 5: PerfectDice = 5 Case 6: PerfectDice = 6 Case 7: PerfectDice = 6 End Select 'Destruyo el sistema... qusys_destroy End Function Básicamente lo que se hace es crear la compuerta V y pedir 3 qubits al sistema (qin(0), qin(1) y qin(2)). Todos los qubits pedidos se inicializan en |0>, según mi actual implementación del simulador (que en un futuro seguramente va a cambiar |000> con 1/6 de probabilidad de salir, |001> con 1/6 de probabilidad de salir, |010> con 1/6 de probabilidad de salir, |011> con 1/6 de probabilidad de salir, |100> con 1/12 de probabilidad de salir, |101> con 1/12 de probabilidad de salir, |110> con 1/12 de probabilidad de salir, |111> con 1/12 de probabilidad de salir. Ahora medimos... Si obtenemos |000>, retornamos 1 (o sea, que al lanzar el dado, salió el 1). Si obtenemos |001>, retornamos 2... para |010> retornamos 3 y para |011> retornamos 4. La probabilidad de que obtengamos uno de estos cuatro estados previamente mencionados es de 1/6, por lo tanto esta asignación de estados y valores devueltos es correcta. La probabilidad de que salgan |100> ó |101> es 1/12 + 1/12 = 1/6. La misma probabilidad para que salgan |110> ó |111>. Entonces, si obtenemos |100> ó |101>, devolvemos 5... si obtenemos |110> ó |111>, devolvemos 6. Listo! Si alguien nota algo mal, no dude en notificarme! Ah! Y no me pregunten por qué elegí la V para la compuerta; no es muy cómodo ni muy adecuado utilizar una V para una transformación lineal, porque se confundiría con la notación empleada para los vectores y los espacios vectoriales, jaja. La verdad es que ni siquiera yo recuerdo por qué elegí la V (hace un par de años), pero debe ser por una buena razón! Por otro lado, los qubits son "qin" porque en mi primera implementación de la función el tamaño del vector de estado era 6: tres qubits de entrada y tres de salida... los de salida eran los "qout", jojo, qué vivo! ![]() Generalización! ¿Y si quisiéramos generalizar el algoritmo anterior para N estados? Con N = 2 sería simular el lanzamiento de una moneda, con N = 6 sería simular el lanzamiento de un dado común y corriente... todo con el mismo algoritmo: 'Devuelve un número al azar entre 0 y N-1. Si N < 1, entonces devuelve 0. Function PerfectNToOne(N As Integer) As Integer Dim qin() As ptrQubit Dim V As quOperation Dim a As Double, b As Double Dim StateWidth As Double, MeasuredState As Integer Dim MinResult As Integer Dim m As Integer Dim i As Long 'Si N < 2, entonces devuelvo 0 (por definición y para ahorrarnos 'algunas dificultades). If N < 2 Then PerfectNToOne = 0 Exit Function End If 'Almaceno en m la cantidad de qubits que necesito para 'albergar todos los posibles estados finales. m = -Int(-Log(N) / Log(2)) 'Creo el sistema de tamaño m y doy dimensiones a qin. qusys_create CLng(m) ReDim qin(1 To m) As ptrQubit 'Pido memoria para m qubits. For i = 1 To m qin(i) = qubit_alloc() Next 'Rotación de los primeros m-1 qubits. For i = 1 To m - 1 qubit_had qin(i) Next 'Aquí el vector de estado es una superposición de exactamente '2^(m-1) estados. 'MsgBox stats_qusys_ex(True) 'Mido los primero m-1 qubits. Obtengo el valor del vector de estado y 'el mínimo resultado final posible (porque al final, antes de medir, 'el sistema quedará en una superposición de exactamente dos estados). MeasuredState = qusys_measure StateWidth = N / 2 ^ (m - 1) MinResult = Int(MeasuredState * StateWidth) 'Creo aplicación lineal correspondiente, dependiendo del estado medido 'previamente. Debo crear una compuerta que aplicada a |0> superponga 'al último qubit entre un estado |0> con probalidad p (asociada al 'resultado MinResult+1) y un estado |1> con probabilidad 1-p (asociada 'con el resultado MinResult). a = Sqr((1 + MinResult - MeasuredState * StateWidth) / StateWidth) b = Sqr(Abs(a * a - 1)) V.a11 = cpxCreate(b, 0) V.a12 = cpxCreate(a, 0) V.a21 = cpxCreate(a, 0) V.a22 = cpxCreate(-b, 0) 'Aplico rotación del último qubit. qubit_u qin(m), V 'Aquí el vector de estado es una superposición de exactamente 2 estados. 'MsgBox stats_qusys_ex(True) 'Mido último qubit. If qubit_measure(qin(m)) Then PerfectNToOne = MinResult Else PerfectNToOne = MinResult + 1 End If 'Destruyo el sistema... qusys_destroy End Function Este algoritmo funciona, se los juro, jaja. No me pidan una explicación y menos que pruebe su correcto funcionamiento porque es un lío bastante importante, jaja. Además, los comentarios dentro del código están a "boleo" (hay varias informalidades y creo que sólo yo puedo entenderlas, jaja) y seguro que en un futuro encuentro una mejor implementación (lo que va a hacer que reescriba el programa). Cabe destacar que si bien podría haber utilizado más compuertas cuánticas en vez de usar tantos artefactos clásicos, estubo bueno mezclar ambos mundos, cuántico y clásico. Por ejemplo, podría haber decidido que el programa realice la medición en uno de los últimos pasos, como es de esperarse, en vez de medir dos veces. Sin embargo me decidí por usar un poco más el ingenio; cuando se trabaja puramente con circuitos o algoritmos cuánticos no es muy fácil imaginarse los cambios de estado que va realizando la máquina. Por lo tanto, los métodos que usé (como muchos otros) son buenas evidencias de que los ordenadores cuánticos NO van a reemplazar a los clásicos (aunque sean más potentes y generales), sino que ambos van a complementarse. ![]() Más eficiente!Esta nueva versión del algoritmo generalizado sólo utiliza un qubit en vez de O(log(N))! 'Devuelve un número al azar entre 0 y N-1. Si N < 1, entonces devuelve 0. 'Esta es la segunda versión del algoritmo! En esta versión, probamos que con un sólo 'qubit (en vez de O(log2(n))) y muchos artilugios clásicos es posible llegar al 'mismo resultado. Function PerfectNToOne(n As Integer) As Integer Dim q As ptrQubit Dim v As quOperation Dim a As Double, b As Double Dim StateWidth As Double, MeasuredState As Integer Dim MinResult As Integer Dim m As Integer Dim i As Long, k As Long 'Si N < 2, entonces devuelvo 0 (por definición y para ahorrarnos 'algunas dificultades). If n < 2 Then PerfectNToOne = 0 Exit Function End If 'Almaceno en m el tamaño en bits de MeasuredState. m = -Int(-Log(n) / Log(2)) - 1 'Busco un número al azar entre 0 y 2^m-1 para guardarlo en MeasuredState. 'Todo este proceso se puede lograr usando sólo un qubit a la vez. k = 1 MeasuredState = 0 For i = 1 To m 'Creo el sistema, pido un qubit y le aplico Hadamard. qusys_create 1 q = qubit_alloc() qubit_had q 'Si al medir obtengo un verdadero, agrego un bit 1 a MeasuredState. If qubit_measure(q) Then MeasuredState = MeasuredState + k k = k * 2 'Destruyo el sistema (un poco brusco, pero eficiente :)... podríamos 'reciclar y liberar... pero ese es otro tema). qusys_destroy Next 'Al final, antes de medir, el sistema quedará en una superposición 'de exactamente dos estados. Al medir, uno de esos dos estados será el final 'y derivará en uno de dos resultados. Ahora, obtengo el mínimo resultado final 'posible. StateWidth = n / 2 ^ m MinResult = Int(MeasuredState * StateWidth) 'Inicio el sistema y pido memoria para un qubit. qusys_create 1 q = qubit_alloc() 'Creo aplicación lineal correspondiente, dependiendo de MeasuredState. 'Debo crear una compuerta V tal que V|0> sea superposición entre un estado '|0> con probalidad p asociada al resultado MinResult+1, y un estado |1> de 'probabilidad 1-p asociada con el resultado MinResult. a = Sqr((1 + MinResult - MeasuredState * StateWidth) / StateWidth) b = Sqr(Abs(a * a - 1)) v.a11 = cpxCreate(b, 0) v.a12 = cpxCreate(a, 0) v.a21 = cpxCreate(a, 0) v.a22 = cpxCreate(-b, 0) 'Aplico rotación del qubit. qubit_u q, v 'Aquí el vector de estado es una superposición de exactamente 2 estados. 'MsgBox stats_qusys_ex(True) 'Mido qubit. If qubit_measure(q) Then PerfectNToOne = MinResult Else PerfectNToOne = MinResult + 1 End If 'Destruyo el sistema. qusys_destroy End Function Esta vez explicaré la idea del funcionamiento del algoritmo para un ejemplo súper concreto. Supongamos que N=6, por lo que la meta sería devolver un número al azar entre 0 y 5. Imaginemos que tenemos un espacio de posibles resultados finales, como el siguiente: posibles valores a devolver: 0, 1, 2, 3, 4, 5 Primero dividimos este espacio exactamente en dos partes: parte 1: 0, 1, 2 parte 2: 3, 4, 5 Tiremos una moneda. Si nos sale cara, nos quedamos con la parte 1; si nos sale cruz, con la parte 2. Supongamos que nos sale cara. Sólo nos quedamos con la parte 1 y desechamos la otra: posibles valores a devolver ahora: 0, 1, 2 Dividamos de nuevo este espacio exactamente en dos partes: parte 1->1: 0, 1 parte 1->2: 1, 2 Notemos que tuvimos que dividir el 1 entre las dos partes. Ahora volvamos a lanzar la moneda y supongamos que volvemos a obtener cara. Nos quedamos con la primera parte otra vez (si nos hubiese salido cruz, nos hubiésemos quedado con la otra parte, por supuesto posibles valores a devolver ahora: 0, 1 Acercándonos al final, dividimos otra vez el espacio en dos: parte 1->1->1: 0 parte 1->1->2: 1 ... pero esta vez hay un cambio. Finalmente, lo que debemos hacer es tirar una "moneda especial" o "de fantasía". Especial en el sentido que no sea equiprobable que salga cualquier cara. Si fuese equiprobable, el valor 1 tendría más posibilidades de salir que otros valores (desde un principio) porque es compartido por dos partes: la 1->1->2 y la 1->2->1. Por lo tanto, para este ejemplo en particular, conviene lanzar una moneda con la cual salga cara 2/3 de las veces y cruz 1/3 de las veces. Si sale cara, devolvemos 0 y terminamos. Si sale cruz, devolvemos 1 y terminamos. En general, para cualquier N, notemos que a medida que vamos lanzando las monedas, vamos cerrando el espacio de resultados, desechando algunos de ellos. Todos los lanzamientos son con monedas tradicionales, excepto el último. Para mi versión cuántica de este algoritmo, las simulaciones de los lanzamientos se hacen aprovechando las propiedades de superposición de estados en un qubit. Para las tiradas normales, usamos el operador Hadamard sobre |0>, ya que H|0> = 1/sqrt(2) * (|0> + |1>), y luego medimos. Para el último tiro, usamos un operador V tal que V|0> sea una superposición adecuada, y luego medimos. En fin, espero que se haya entendido algo 3/10/2009 TemperamentalMusiquita nueva de Javi y Everything But The Girl, je... Este es mi remix de "Temperamental", un tema de los 90' de la banda inglesa que ya nombré: "Everything But The Girl". Deben recordar a la banda por un tema muy famoso, "Missing"... El estribillo es "... and I miss you, yeah... like the deserts miss the rain...". Hasta fue cantada en español por no sé quién, y el estribillo sonaba como "... te extraño amor... como el mar extraña al sol...". Ahora sí se acuerdan, no? Espero que le guste, señor/a. Para descargar el archivo, click AQUÍ. 3/4/2009 ¿Por qué no me gusta la onda Flogger?Es simple: yo defino a la onda Flogger como "LA onda exhibicionista y narcisista a principios del siglo 21". Para extender la definición, podría agregar palabras como "ingenua, adolescente e inocente"... pero lo detestable es su narcisismo. Además, si bien muchos integrantes afirman que este acto de sacarse fotos y publicarlas en internet es sólo un juego, y/o que sólo les gusta verse bien, la onda Flogger es un icono del exhibicionismo.
¿Digo más? Me niego a discriminarlos, pero entiendo por qué mucha gente los discrimina. Lo que no entiendo es cómo un flogger justifica que prefiere seguir publicando sus fotos aún cuando muchos lo consideren un idiota. Porque si publicar sus fotografías fuese un acto interesante o desinteresado (je Bueno, hoy comencé las clases otra vez... ... en el caso de los hombres, 1) los que usan anteojos, camisas (muy) dentro del pantalón, cabello con raya y gomina, y pantalones de vestir, 2) los que van con remeras rotozas, jean o pantalones cortos, zapatillas sin medias, cabello "einsteniado" o sin cabello (algunos por elección propia para no tener que peinarse, jaja). (yo creo que ando más cerca del 2 que del 1) ... en el caso de las mujeres (bueno, sí hay mujeres, pero les aseguro que hay muchas más cursando psicología), 1) lo mismo que el 1 para los hombres, sólo que en versión mujer, jeje, 2) las neutrales... me refiero a, bueno, aquellas que llevan pantalón y remerita, y ya... poco o nada de maquillaje, peinado ordenado que no llama mucho la atención, zapatillas o sandalias, y ya...! 3) Flor... todo famanauta sabe quién es Flor, jaja. Te amamos Flor, aguante Oktubre, je. Por eso un/a chico/a de onda flogger parece no encajar en este patrón. Pero ojo... me puse a pensar (en serio?
Alguna que otra info fue "robada" de: * http://es.wikipedia.org/wiki/Subcultura 2/9/2009 Nuestra música (verdaderamente nuestra)! Hacía tiempo que Bruno y yo teníamos ganas de grabar algo, improvisando un poco. Hace unos meses, a finales del año pasado, tuve la oportunidad de pasarme por el depto de los Ottero (Bruno y Nico Ottero). Bruno me contó que estaba jugando un poco con su pc, creando algunos ritmos y acordes... recién empezaba con todo esto de la música electrónica, y me pedía su opinión. Cuando escuché lo que tenía hecho, me gustó mucho. Y más cuando se puso improvisar con su guitarra sobre la base! Me gustó tanto que dije: "Puedo agregarle algunas cosas... algunos efectos y bobadas?"... y así fue que empezamos. Horas más tarde, después de tanto chochín, el tema ya había evolucionado mucho. Entonces sabíamos que debíamos terminarlo. Le dije: "Pasame el proyecto por internet, pasate alguno de estos días por mi depto, pero traé la guitarra... vas a improvisar y vamos a grabar". Días más tarde, Bruno llegó con su guitarra y nos pasamos toda la noche grabando... de tanta prueba y error, salió algo que nos gustó. Otros días y retoques más tarde, nos decidimos por "El Faro", nombre que se le ocurrió a Bruno. Aquí dejo el link, ojalá les guste (y si no, &%$#@!): El Faro (2008-2009). No se sorprendan si en unos días cambio algo en el tema y subo una nueva versión. Soy medio perfeccionista. 2/1/2009 El ExtranjeroImaginá que tu comunidad y vos viven sobre la superficie de un río, que fluye a cierta velocidad. Podrías suponer por ejemplo que todos están sobre una hoja flotando sobre el río y viajando a la misma velocidad que el agua. Yo llamaré a este mundo "Irupé". Suponé además que esta velocidad se mantiene casi constante durante toda una vida promedio de un irupeano. Imagina que los bordes de este río están muy alejados entre sí, y son (quizá) imperceptibles para cualquier individuo que forma parte de tu pueblo... vos incluido. Generalizando, piensa que todos (o casi todos) desconocen acerca de la presencia de este río. Finalmente, imaginá que cada irupeano tiene un vida normal en ese mundo, que los miembros se relacionan entre sí, que hacen que su mundo se desarrolle día a día... esto es lo mismo que decir que el mundo se desarrolle metro a metro, ya que flujo del tiempo va de la mano con el fluir del río.
Un día, conoces a un individuo que afirma ser extranjero. Él te dice que en un futuro no muy lejano, una enorme roca chocará con tu mundo y que muchos van a morir. Ya que "nadie" puede conocer el futuro, y no se observa ningún rastro de esta posible futura catástrofe, considerás este presagio absurdo. Sin embargo, días más tarde, una piedra enorme proveniente de algún lugar arrasa con todo. Entonces, ¿el extranjero a resultado ser un profeta?.
Ahora imaginemos que nuestra realidad, o nuestra percepción del universo como humanos, sea similar a la realidad de un irupeano. Pensemos que el tiempo es ese río, y que fluye a una “velocidad” (entre comillas, ya que por velocidad muchas veces se entiende espacio sobre tiempo) casi constante, corriendo de pasado a futuro. Si bien como humanos podemos desplazarnos libremente a través de tres dimensiones (x, y, z; latitud, longitud, altura; r, phi, z; como sea!), estamos atados al flujo del tiempo. Por lo tanto, no podemos concebir la idea de que alguien o de que algo pueda predecir futuros sucesos. Sin embargo, por analogía, podríamos idear a un hipotético extranjero, que sepa como liberarse del flujo del tiempo, capaz de leer y escribir el futuro (o también el pasado, ¿por qué no?) a gusto.
Si bien hay muchos aspectos en la matemática y la física que parecen contradecir la existencia de tal poder de predicción (como lo son la Teoría del Caos, o el Principio de Incertidumbre de Heisenberg), vale la pena darle rienda suelta a la imaginación.
OTROS DATOS:
¡Gracias por tu visita!
|
|||||||||||||||
|
|