Mostrando entradas con la etiqueta Maxima. Mostrar todas las entradas
Mostrando entradas con la etiqueta Maxima. Mostrar todas las entradas

Vigenere en Máxima

alf:"abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQ-RSTUVWXYZáéíóúÁÉÍÓÚ0123456789 ,.;:";


codi_numerica(alf,msj):=block(
    [extra],
if stringp(msj) then (
    extra:makelist(mod(sposition(charat(msj,i),alf),slength(alf)),i,1,slength(msj))
     )
           else
        (
        extra:"",
        for i in msj do extra:concat(extra,alf[i-1])
        ),
    extra
    )$

hacer_clave(clave,longitud):=block(

    [solucion],
    solucion:"",
    for i:0 thru longitud do (
        solucion:concat(solucion,clave[mod(i,slength(clave))])
    ),
    solucion
);

/*funcion vigenere*/
vigenere(alfabeto, mensaje, clave):=block(

    [modulo, secuencia, secuencia_clave, longitud_clave, longitud_mensaje, solucion, secuencia_solucion],
    modulo:slength(alfabeto),
    secuencia:codi_numerica(alfabeto, mensaje),
    longitud_clave:slength(clave),  
    longitud_mensaje:slength(mensaje),
    secuencia_clave:codi_numerica(alfabeto, hacer_clave(clave, longitud_mensaje)),
    secuencia_solucion:makelist(mod(secuencia[i]-secuencia_clave[i], modulo),i,1,longitud_mensaje),
    solucion:codi_numerica(alfabeto,secuencia_solucion),
    solucion


);

/*ejecutar la funcion*/
vigenere(alf,":DoqqO67ogwegvwñAUgÑi6rodo:qWxjyKxYhVfÍeoi,:rlhujplCDR2;o6Bavz:fú6ndw", "G1-01: 2 de enero");


Repetir un string el número de veces deseado en Maxima

hacer_clave(clave,longitud):=block(

    [solucion],
    solucion:"",
    for i:0 thru longitud do (
        solucion:concat(solucion,clave[mod(i,slength(clave))])
    ),
    solucion
);


La solución es una cadena con la palabra clave, repetida tantas veces como sea necesario hasta que la cadena tenga la longitud introducida. 

Pasar de texto a números en Maxima y viceversa

alf:"abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQ-RSTUVWXYZáéíóúÁÉÍÓÚ0123456789 ,.;:";

codi_numerica(alf,msj):=block(
    [extra],
if stringp(msj) then (
    extra:makelist(mod(sposition(charat(msj,i),alf),slength(alf)),i,1,slength(msj))
     )
           else
        (
        extra:"",
        for i in msj do extra:concat(extra,alf[i-1])
        ),
    extra
    )$


alf es el alfabeto que usa, la 'a' es la posición 1, la 'b' la 2.... ':' la 0 y última posición.
Si a la función le pasas un mensaje en formato String (texto), te devolverá un array y en cada posición de este el valor de cada caracter de la cadena.
Si a la función le pasas un mensaje en formato array numérico, te devolvera una cadena String con el texto solución.

Codificar y descodificar en Máxima

DESCARGAR


alf:"abcdefghijklmnñopqrstuvxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ .,:áéíóúÁÉÍÓÚ";

mensajes_cif:["sqmzrkñbkmjrb númjbSSbkmÓúgcrqmqkñCkmjúWúmbrkqñqt","óyFIy,óItyAItAIyxIh,tÑyóyFÚyR,byN,yCIyC,rcG",
"MdrYBYKg.YKbWEKWRWEKEYKPYKt.oGYrdzKÚWbdNW"," VíeybKbVifbVflVtbÑQV:bVKbyyeyeVTeVtQKeÍ","DLRLódLÓfXóyfXóSLXfXórXdgÍóyyrÍfXóÓróRFófyRf","JAJKpJóflJfcgóf.Fógó fccJXgflJcfgcAgfAogD","ÚhPE zdhqyZqdíZÍzgqFZqhPZÉZdqhqiEqhUihg","NDScDYiVcfcnDiDziDYiziÑViDáczivfsztiú",
"LsOyCxíjxOñCjiXnOñjddjxOcOsxíYxOñnNnOXDxíjiísk","Ñ KHgmH xhuh tTKJmúÉhgKÚukóÁUhHk Kú kóóTVVhA","RÓd ÓbÁ QÓj Qj ÓA fbQsÓÁÓdCÓObNÓUbÓtÓlAGlUNlÉ",
"ÍWPmZdkyodkZdkOmeedkOÁHkdekúedHOúÁkIozÁé","UñmnItvAHtvVtvPnÓWtvVnIÓBñsvX:svVHvÉBWtsXB:","íBñqXIíXpXIYfñIBápNñqñmIgópNBLIíXpXIYfIñfóBBXx",
"gx.pTbRÓRTfoTéRbH.GTboffoúoTVTbRépj.foúoN","mtéAíXeRkíMéeAéheéeAxDeXXpZéxpRéXe:pRMéléAeRkíXXM,","TzKLqELudOdtGCGJGKqdsGDGdKzdyMrzuJqKdDMuJLGe",
"ZproFrgrxOroMpYApCMTzo:proTApOéTroxrTYrpt","jB,:ÓtIBsY,gU,SBsY,gU,BT,BMh,BctB:,sBLy,UÓtK"] $

claves:[[4,1],[8,2],[12,3],[16,4],[20,5],[24,6],[28,7],[32,8],[36,9],[40,10],[44,11],[48,12],[52,13],[56,14],[60,15],[64,16],[1,17],[5,18],[9,19]];

codi_numerica(alf,msj):=block(
    [extra],
if stringp(msj) then extra:makelist(sposition(charat(msj,i),alf)-1,i,1,slength(msj))
        else
        (
        extra:"",
        for i in msj do extra:concat(extra,alf[i])
        ),
    extra
    )$

clave_descifrado(clave, alf):=block(

    [modulo, descifrado],
    modulo:slength(alf),
    descifrado:[mod(inv_mod(clave[1], modulo),modulo), mod(-inv_mod(clave[1], modulo)*clave[2], modulo)]

);

clave_descifrado(claves[1], alf);

descodificar(alfabeto, mensaje, clave_cif):=block(

    [mensaje_numeros, clave_descif, descif, modulo, msg],
    modulo:slength(alfabeto),
    mensaje_numeros:codi_numerica(alfabeto, mensaje),
    clave_descif:clave_descifrado(clave_cif, alfabeto),
    descif:makelist(mod(clave_descif[1]*mensaje_numeros[i]+clave_descif[2],modulo) ,i,1,length(mensaje_numeros)),
    msg:codi_numerica(alfabeto, descif),
    msg
);

descodificar(alf, mensajes_cif[17], claves[17]);

codificar(alfabeto, mensaje, clave_cif):=block(

    [mensaje_numeros, cif, modulo, msg],
    modulo:slength(alfabeto),
    mensaje_numeros:codi_numerica(alfabeto, mensaje),
    cif:makelist(mod(clave_cif[1]*mensaje_numeros[i]+clave_cif[2],modulo) ,i,1,length(mensaje_numeros)),
    msg:codi_numerica(alfabeto, cif),
    msg
);

mensaje2:"Los españoles muy españoles y mucho españoles";
clavee:[3,10];

codificar(alf, mensaje2, clavee);