{
- "metadata": {
- "name": "",
- "signature": "sha256:112d1c84c318592f927e18c5b0f15ed60ac8418ca15cb79596ba6212ff2d7e3f"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
+ "cells": [
{
- "cells": [
- {
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "import matplotlib.pyplot as plt\n",
- "import pandas as pd\n",
- "import collections\n",
- "import string\n",
- "import numpy as np\n",
- "from numpy import matrix\n",
- "from numpy import linalg\n",
- "%matplotlib inline\n",
- "\n",
- "from cipher import *\n",
- "from cipherbreak import *\n",
- "\n",
- "c6a = open('2014/6a.ciphertext').read()\n",
- "c6b = open('2014/6b.ciphertext').read()"
- ],
- "language": "python",
- "metadata": {},
- "outputs": [],
- "prompt_number": 54
- },
- {
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "key_a, score = railfence_break(sanitise(c6a))\n",
- "key_a, score"
- ],
- "language": "python",
- "metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 3,
- "text": [
- "(3, -2314.997881051078)"
- ]
- }
- ],
- "prompt_number": 3
- },
- {
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "' '.join(segment(railfence_decipher(sanitise(c6a), key_a)))"
- ],
- "language": "python",
- "metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 4,
- "text": [
- "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'"
- ]
- }
- ],
- "prompt_number": 4
- },
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "import collections\n",
+ "import string\n",
+ "import numpy as np\n",
+ "from numpy import matrix\n",
+ "from numpy import linalg\n",
+ "%matplotlib inline\n",
+ "\n",
+ "from cipher import *\n",
+ "from cipherbreak import *\n",
+ "\n",
+ "c6a = open('2014/6a.ciphertext').read()\n",
+ "c6b = open('2014/6b.ciphertext').read()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "c6bs = sanitise(c6b)\n",
- "c6bs"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "(3, -2314.997881051078)"
+ ]
+ },
+ "execution_count": 3,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 7,
- "text": [
- "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'"
- ]
- }
- ],
- "prompt_number": 7
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "key_a, score = railfence_break(sanitise(c6a))\n",
+ "key_a, score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "c6b_nums = [ord(c) - ord('a') for c in c6bs]\n",
- "c6b_nums"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'"
+ ]
+ },
+ "execution_count": 4,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 17,
- "text": [
- "[7,\n",
- " 22,\n",
- " 18,\n",
- " 18,\n",
- " 18,\n",
- " 22,\n",
- " 23,\n",
- " 5,\n",
- " 4,\n",
- " 22,\n",
- " 7,\n",
- " 7,\n",
- " 17,\n",
- " 5,\n",
- " 4,\n",
- " 22,\n",
- " 15,\n",
- " 3,\n",
- " 17,\n",
- " 21,\n",
- " 19,\n",
- " 19,\n",
- " 3,\n",
- " 7,\n",
- " 23,\n",
- " 1,\n",
- " 2,\n",
- " 2,\n",
- " 11,\n",
- " 4,\n",
- " 0,\n",
- " 24,\n",
- " 15,\n",
- " 7,\n",
- " 0,\n",
- " 11,\n",
- " 13,\n",
- " 0,\n",
- " 3,\n",
- " 7,\n",
- " 8,\n",
- " 4,\n",
- " 7,\n",
- " 0,\n",
- " 14,\n",
- " 20,\n",
- " 3,\n",
- " 17,\n",
- " 14,\n",
- " 19,\n",
- " 22,\n",
- " 13,\n",
- " 17,\n",
- " 17,\n",
- " 21,\n",
- " 24,\n",
- " 18,\n",
- " 0,\n",
- " 1,\n",
- " 9,\n",
- " 11,\n",
- " 19,\n",
- " 19,\n",
- " 1,\n",
- " 0,\n",
- " 24,\n",
- " 19,\n",
- " 12,\n",
- " 4,\n",
- " 11,\n",
- " 17,\n",
- " 10,\n",
- " 0,\n",
- " 8,\n",
- " 3,\n",
- " 14,\n",
- " 15,\n",
- " 19,\n",
- " 7,\n",
- " 0,\n",
- " 19,\n",
- " 11,\n",
- " 4,\n",
- " 11,\n",
- " 17,\n",
- " 19,\n",
- " 22,\n",
- " 0,\n",
- " 0,\n",
- " 12,\n",
- " 0,\n",
- " 13,\n",
- " 4,\n",
- " 10,\n",
- " 18,\n",
- " 21,\n",
- " 21,\n",
- " 25,\n",
- " 17,\n",
- " 21,\n",
- " 11,\n",
- " 11,\n",
- " 0,\n",
- " 19,\n",
- " 10,\n",
- " 2,\n",
- " 17,\n",
- " 9,\n",
- " 16,\n",
- " 20,\n",
- " 8,\n",
- " 2,\n",
- " 8,\n",
- " 25,\n",
- " 6,\n",
- " 19,\n",
- " 14,\n",
- " 16,\n",
- " 2,\n",
- " 15,\n",
- " 13,\n",
- " 17,\n",
- " 17,\n",
- " 10,\n",
- " 19,\n",
- " 19,\n",
- " 14,\n",
- " 22,\n",
- " 0,\n",
- " 13,\n",
- " 3,\n",
- " 16,\n",
- " 4,\n",
- " 7,\n",
- " 19,\n",
- " 16,\n",
- " 17,\n",
- " 21,\n",
- " 19,\n",
- " 1,\n",
- " 0,\n",
- " 24,\n",
- " 3,\n",
- " 16,\n",
- " 4,\n",
- " 0,\n",
- " 11,\n",
- " 0,\n",
- " 13,\n",
- " 13,\n",
- " 14,\n",
- " 7,\n",
- " 20,\n",
- " 11,\n",
- " 0,\n",
- " 13,\n",
- " 20,\n",
- " 25,\n",
- " 11,\n",
- " 22,\n",
- " 4,\n",
- " 23,\n",
- " 19,\n",
- " 11,\n",
- " 21,\n",
- " 9,\n",
- " 17,\n",
- " 21,\n",
- " 8,\n",
- " 21,\n",
- " 7,\n",
- " 13,\n",
- " 14,\n",
- " 7,\n",
- " 3,\n",
- " 16,\n",
- " 12,\n",
- " 6,\n",
- " 24,\n",
- " 10,\n",
- " 0,\n",
- " 2,\n",
- " 11,\n",
- " 12,\n",
- " 18,\n",
- " 22,\n",
- " 17,\n",
- " 20,\n",
- " 15,\n",
- " 3,\n",
- " 4,\n",
- " 19,\n",
- " 5,\n",
- " 8,\n",
- " 14,\n",
- " 5,\n",
- " 19,\n",
- " 5,\n",
- " 4,\n",
- " 11,\n",
- " 7,\n",
- " 25,\n",
- " 15,\n",
- " 23,\n",
- " 7,\n",
- " 0,\n",
- " 18,\n",
- " 22,\n",
- " 5,\n",
- " 19,\n",
- " 22,\n",
- " 15,\n",
- " 17,\n",
- " 17,\n",
- " 18,\n",
- " 22,\n",
- " 4,\n",
- " 8,\n",
- " 18,\n",
- " 4,\n",
- " 14,\n",
- " 7,\n",
- " 4,\n",
- " 5,\n",
- " 15,\n",
- " 3,\n",
- " 17,\n",
- " 21,\n",
- " 19,\n",
- " 19,\n",
- " 13,\n",
- " 21,\n",
- " 0,\n",
- " 6,\n",
- " 3,\n",
- " 21,\n",
- " 18,\n",
- " 22,\n",
- " 6,\n",
- " 14,\n",
- " 4,\n",
- " 17,\n",
- " 1,\n",
- " 4,\n",
- " 19,\n",
- " 13,\n",
- " 7,\n",
- " 0,\n",
- " 17,\n",
- " 21,\n",
- " 0,\n",
- " 4,\n",
- " 4,\n",
- " 21,\n",
- " 19,\n",
- " 11,\n",
- " 11,\n",
- " 19,\n",
- " 1,\n",
- " 12,\n",
- " 6,\n",
- " 0,\n",
- " 8,\n",
- " 0,\n",
- " 19,\n",
- " 6,\n",
- " 4,\n",
- " 11,\n",
- " 8,\n",
- " 13,\n",
- " 12,\n",
- " 3,\n",
- " 0,\n",
- " 22,\n",
- " 4,\n",
- " 21,\n",
- " 7,\n",
- " 0,\n",
- " 19,\n",
- " 19,\n",
- " 4,\n",
- " 17,\n",
- " 3,\n",
- " 7,\n",
- " 17,\n",
- " 25,\n",
- " 13,\n",
- " 1,\n",
- " 13,\n",
- " 21,\n",
- " 14,\n",
- " 20,\n",
- " 19,\n",
- " 13,\n",
- " 4,\n",
- " 5,\n",
- " 14,\n",
- " 19,\n",
- " 4,\n",
- " 21,\n",
- " 4,\n",
- " 0,\n",
- " 4,\n",
- " 7,\n",
- " 11,\n",
- " 0,\n",
- " 24,\n",
- " 12,\n",
- " 7,\n",
- " 0,\n",
- " 2,\n",
- " 6,\n",
- " 11,\n",
- " 25,\n",
- " 4,\n",
- " 15,\n",
- " 19,\n",
- " 21,\n",
- " 21,\n",
- " 3,\n",
- " 8,\n",
- " 12,\n",
- " 22,\n",
- " 14,\n",
- " 17,\n",
- " 5,\n",
- " 8,\n",
- " 18,\n",
- " 6,\n",
- " 19,\n",
- " 20,\n",
- " 25,\n",
- " 11,\n",
- " 22,\n",
- " 8,\n",
- " 1,\n",
- " 4,\n",
- " 16,\n",
- " 14,\n",
- " 7,\n",
- " 20,\n",
- " 1,\n",
- " 19,\n",
- " 6,\n",
- " 7,\n",
- " 0,\n",
- " 12,\n",
- " 16,\n",
- " 14,\n",
- " 17,\n",
- " 13,\n",
- " 9,\n",
- " 13,\n",
- " 13,\n",
- " 17,\n",
- " 20,\n",
- " 12,\n",
- " 16,\n",
- " 21,\n",
- " 9,\n",
- " 19,\n",
- " 23,\n",
- " 4,\n",
- " 11,\n",
- " 19,\n",
- " 5,\n",
- " 14,\n",
- " 21,\n",
- " 6,\n",
- " 0,\n",
- " 22,\n",
- " 3,\n",
- " 0,\n",
- " 4,\n",
- " 4,\n",
- " 21,\n",
- " 11,\n",
- " 11,\n",
- " 6,\n",
- " 17,\n",
- " 19,\n",
- " 23,\n",
- " 8,\n",
- " 1,\n",
- " 6,\n",
- " 19,\n",
- " 8,\n",
- " 1,\n",
- " 4,\n",
- " 21,\n",
- " 12,\n",
- " 15,\n",
- " 18,\n",
- " 0,\n",
- " 0,\n",
- " 19,\n",
- " 4,\n",
- " 14,\n",
- " 0,\n",
- " 18,\n",
- " 4,\n",
- " 21,\n",
- " 0,\n",
- " 4,\n",
- " 24,\n",
- " 16,\n",
- " 14,\n",
- " 7,\n",
- " 0,\n",
- " 12,\n",
- " 4,\n",
- " 14,\n",
- " 13,\n",
- " 13,\n",
- " 2,\n",
- " 5,\n",
- " 20,\n",
- " 8,\n",
- " 3,\n",
- " 14,\n",
- " 4,\n",
- " 5,\n",
- " 0,\n",
- " 5,\n",
- " 0,\n",
- " 19,\n",
- " 19,\n",
- " 4,\n",
- " 12,\n",
- " 20,\n",
- " 8,\n",
- " 12,\n",
- " 13,\n",
- " 5,\n",
- " 11,\n",
- " 25,\n",
- " 13,\n",
- " 1,\n",
- " 4,\n",
- " 10,\n",
- " 14,\n",
- " 5,\n",
- " 14,\n",
- " 1,\n",
- " 17,\n",
- " 11,\n",
- " 8,\n",
- " 0,\n",
- " 4,\n",
- " 7,\n",
- " 7,\n",
- " 0,\n",
- " 20,\n",
- " 8,\n",
- " 7,\n",
- " 13,\n",
- " 13,\n",
- " 13,\n",
- " 22,\n",
- " 25,\n",
- " 0,\n",
- " 4,\n",
- " 4,\n",
- " 21,\n",
- " 19,\n",
- " 11,\n",
- " 11,\n",
- " 19,\n",
- " 15,\n",
- " 0,\n",
- " 0,\n",
- " 11,\n",
- " 13,\n",
- " 0,\n",
- " 13,\n",
- " 21,\n",
- " 19,\n",
- " 25,\n",
- " 11,\n",
- " 25,\n",
- " 20,\n",
- " 20,\n",
- " 2,\n",
- " 15,\n",
- " 19,\n",
- " 0,\n",
- " 4,\n",
- " 11,\n",
- " 8,\n",
- " 13,\n",
- " 0,\n",
- " 13,\n",
- " 15,\n",
- " 0,\n",
- " 0,\n",
- " 7,\n",
- " 4,\n",
- " 22,\n",
- " 5,\n",
- " 19,\n",
- " 7,\n",
- " 0,\n",
- " 14,\n",
- " 18,\n",
- " 4,\n",
- " 19,\n",
- " 0,\n",
- " 17,\n",
- " 8,\n",
- " 1,\n",
- " 13,\n",
- " 1,\n",
- " 13,\n",
- " 21,\n",
- " 7,\n",
- " 0,\n",
- " 4,\n",
- " 21,\n",
- " 3,\n",
- " 7,\n",
- " 24,\n",
- " 24,\n",
- " 19,\n",
- " 11,\n",
- " 12,\n",
- " 20,\n",
- " 23,\n",
- " 1]"
- ]
- }
- ],
- "prompt_number": 17
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "' '.join(segment(railfence_decipher(sanitise(c6a), key_a)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "m = np.matrix([[7,8], [11,11]])\n",
- "m"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'"
+ ]
+ },
+ "execution_count": 7,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 106,
- "text": [
- "matrix([[ 7, 8],\n",
- " [11, 11]])"
- ]
- }
- ],
- "prompt_number": 106
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "c6bs = sanitise(c6b)\n",
+ "c6bs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "np.linalg.det(m)"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[7,\n",
+ " 22,\n",
+ " 18,\n",
+ " 18,\n",
+ " 18,\n",
+ " 22,\n",
+ " 23,\n",
+ " 5,\n",
+ " 4,\n",
+ " 22,\n",
+ " 7,\n",
+ " 7,\n",
+ " 17,\n",
+ " 5,\n",
+ " 4,\n",
+ " 22,\n",
+ " 15,\n",
+ " 3,\n",
+ " 17,\n",
+ " 21,\n",
+ " 19,\n",
+ " 19,\n",
+ " 3,\n",
+ " 7,\n",
+ " 23,\n",
+ " 1,\n",
+ " 2,\n",
+ " 2,\n",
+ " 11,\n",
+ " 4,\n",
+ " 0,\n",
+ " 24,\n",
+ " 15,\n",
+ " 7,\n",
+ " 0,\n",
+ " 11,\n",
+ " 13,\n",
+ " 0,\n",
+ " 3,\n",
+ " 7,\n",
+ " 8,\n",
+ " 4,\n",
+ " 7,\n",
+ " 0,\n",
+ " 14,\n",
+ " 20,\n",
+ " 3,\n",
+ " 17,\n",
+ " 14,\n",
+ " 19,\n",
+ " 22,\n",
+ " 13,\n",
+ " 17,\n",
+ " 17,\n",
+ " 21,\n",
+ " 24,\n",
+ " 18,\n",
+ " 0,\n",
+ " 1,\n",
+ " 9,\n",
+ " 11,\n",
+ " 19,\n",
+ " 19,\n",
+ " 1,\n",
+ " 0,\n",
+ " 24,\n",
+ " 19,\n",
+ " 12,\n",
+ " 4,\n",
+ " 11,\n",
+ " 17,\n",
+ " 10,\n",
+ " 0,\n",
+ " 8,\n",
+ " 3,\n",
+ " 14,\n",
+ " 15,\n",
+ " 19,\n",
+ " 7,\n",
+ " 0,\n",
+ " 19,\n",
+ " 11,\n",
+ " 4,\n",
+ " 11,\n",
+ " 17,\n",
+ " 19,\n",
+ " 22,\n",
+ " 0,\n",
+ " 0,\n",
+ " 12,\n",
+ " 0,\n",
+ " 13,\n",
+ " 4,\n",
+ " 10,\n",
+ " 18,\n",
+ " 21,\n",
+ " 21,\n",
+ " 25,\n",
+ " 17,\n",
+ " 21,\n",
+ " 11,\n",
+ " 11,\n",
+ " 0,\n",
+ " 19,\n",
+ " 10,\n",
+ " 2,\n",
+ " 17,\n",
+ " 9,\n",
+ " 16,\n",
+ " 20,\n",
+ " 8,\n",
+ " 2,\n",
+ " 8,\n",
+ " 25,\n",
+ " 6,\n",
+ " 19,\n",
+ " 14,\n",
+ " 16,\n",
+ " 2,\n",
+ " 15,\n",
+ " 13,\n",
+ " 17,\n",
+ " 17,\n",
+ " 10,\n",
+ " 19,\n",
+ " 19,\n",
+ " 14,\n",
+ " 22,\n",
+ " 0,\n",
+ " 13,\n",
+ " 3,\n",
+ " 16,\n",
+ " 4,\n",
+ " 7,\n",
+ " 19,\n",
+ " 16,\n",
+ " 17,\n",
+ " 21,\n",
+ " 19,\n",
+ " 1,\n",
+ " 0,\n",
+ " 24,\n",
+ " 3,\n",
+ " 16,\n",
+ " 4,\n",
+ " 0,\n",
+ " 11,\n",
+ " 0,\n",
+ " 13,\n",
+ " 13,\n",
+ " 14,\n",
+ " 7,\n",
+ " 20,\n",
+ " 11,\n",
+ " 0,\n",
+ " 13,\n",
+ " 20,\n",
+ " 25,\n",
+ " 11,\n",
+ " 22,\n",
+ " 4,\n",
+ " 23,\n",
+ " 19,\n",
+ " 11,\n",
+ " 21,\n",
+ " 9,\n",
+ " 17,\n",
+ " 21,\n",
+ " 8,\n",
+ " 21,\n",
+ " 7,\n",
+ " 13,\n",
+ " 14,\n",
+ " 7,\n",
+ " 3,\n",
+ " 16,\n",
+ " 12,\n",
+ " 6,\n",
+ " 24,\n",
+ " 10,\n",
+ " 0,\n",
+ " 2,\n",
+ " 11,\n",
+ " 12,\n",
+ " 18,\n",
+ " 22,\n",
+ " 17,\n",
+ " 20,\n",
+ " 15,\n",
+ " 3,\n",
+ " 4,\n",
+ " 19,\n",
+ " 5,\n",
+ " 8,\n",
+ " 14,\n",
+ " 5,\n",
+ " 19,\n",
+ " 5,\n",
+ " 4,\n",
+ " 11,\n",
+ " 7,\n",
+ " 25,\n",
+ " 15,\n",
+ " 23,\n",
+ " 7,\n",
+ " 0,\n",
+ " 18,\n",
+ " 22,\n",
+ " 5,\n",
+ " 19,\n",
+ " 22,\n",
+ " 15,\n",
+ " 17,\n",
+ " 17,\n",
+ " 18,\n",
+ " 22,\n",
+ " 4,\n",
+ " 8,\n",
+ " 18,\n",
+ " 4,\n",
+ " 14,\n",
+ " 7,\n",
+ " 4,\n",
+ " 5,\n",
+ " 15,\n",
+ " 3,\n",
+ " 17,\n",
+ " 21,\n",
+ " 19,\n",
+ " 19,\n",
+ " 13,\n",
+ " 21,\n",
+ " 0,\n",
+ " 6,\n",
+ " 3,\n",
+ " 21,\n",
+ " 18,\n",
+ " 22,\n",
+ " 6,\n",
+ " 14,\n",
+ " 4,\n",
+ " 17,\n",
+ " 1,\n",
+ " 4,\n",
+ " 19,\n",
+ " 13,\n",
+ " 7,\n",
+ " 0,\n",
+ " 17,\n",
+ " 21,\n",
+ " 0,\n",
+ " 4,\n",
+ " 4,\n",
+ " 21,\n",
+ " 19,\n",
+ " 11,\n",
+ " 11,\n",
+ " 19,\n",
+ " 1,\n",
+ " 12,\n",
+ " 6,\n",
+ " 0,\n",
+ " 8,\n",
+ " 0,\n",
+ " 19,\n",
+ " 6,\n",
+ " 4,\n",
+ " 11,\n",
+ " 8,\n",
+ " 13,\n",
+ " 12,\n",
+ " 3,\n",
+ " 0,\n",
+ " 22,\n",
+ " 4,\n",
+ " 21,\n",
+ " 7,\n",
+ " 0,\n",
+ " 19,\n",
+ " 19,\n",
+ " 4,\n",
+ " 17,\n",
+ " 3,\n",
+ " 7,\n",
+ " 17,\n",
+ " 25,\n",
+ " 13,\n",
+ " 1,\n",
+ " 13,\n",
+ " 21,\n",
+ " 14,\n",
+ " 20,\n",
+ " 19,\n",
+ " 13,\n",
+ " 4,\n",
+ " 5,\n",
+ " 14,\n",
+ " 19,\n",
+ " 4,\n",
+ " 21,\n",
+ " 4,\n",
+ " 0,\n",
+ " 4,\n",
+ " 7,\n",
+ " 11,\n",
+ " 0,\n",
+ " 24,\n",
+ " 12,\n",
+ " 7,\n",
+ " 0,\n",
+ " 2,\n",
+ " 6,\n",
+ " 11,\n",
+ " 25,\n",
+ " 4,\n",
+ " 15,\n",
+ " 19,\n",
+ " 21,\n",
+ " 21,\n",
+ " 3,\n",
+ " 8,\n",
+ " 12,\n",
+ " 22,\n",
+ " 14,\n",
+ " 17,\n",
+ " 5,\n",
+ " 8,\n",
+ " 18,\n",
+ " 6,\n",
+ " 19,\n",
+ " 20,\n",
+ " 25,\n",
+ " 11,\n",
+ " 22,\n",
+ " 8,\n",
+ " 1,\n",
+ " 4,\n",
+ " 16,\n",
+ " 14,\n",
+ " 7,\n",
+ " 20,\n",
+ " 1,\n",
+ " 19,\n",
+ " 6,\n",
+ " 7,\n",
+ " 0,\n",
+ " 12,\n",
+ " 16,\n",
+ " 14,\n",
+ " 17,\n",
+ " 13,\n",
+ " 9,\n",
+ " 13,\n",
+ " 13,\n",
+ " 17,\n",
+ " 20,\n",
+ " 12,\n",
+ " 16,\n",
+ " 21,\n",
+ " 9,\n",
+ " 19,\n",
+ " 23,\n",
+ " 4,\n",
+ " 11,\n",
+ " 19,\n",
+ " 5,\n",
+ " 14,\n",
+ " 21,\n",
+ " 6,\n",
+ " 0,\n",
+ " 22,\n",
+ " 3,\n",
+ " 0,\n",
+ " 4,\n",
+ " 4,\n",
+ " 21,\n",
+ " 11,\n",
+ " 11,\n",
+ " 6,\n",
+ " 17,\n",
+ " 19,\n",
+ " 23,\n",
+ " 8,\n",
+ " 1,\n",
+ " 6,\n",
+ " 19,\n",
+ " 8,\n",
+ " 1,\n",
+ " 4,\n",
+ " 21,\n",
+ " 12,\n",
+ " 15,\n",
+ " 18,\n",
+ " 0,\n",
+ " 0,\n",
+ " 19,\n",
+ " 4,\n",
+ " 14,\n",
+ " 0,\n",
+ " 18,\n",
+ " 4,\n",
+ " 21,\n",
+ " 0,\n",
+ " 4,\n",
+ " 24,\n",
+ " 16,\n",
+ " 14,\n",
+ " 7,\n",
+ " 0,\n",
+ " 12,\n",
+ " 4,\n",
+ " 14,\n",
+ " 13,\n",
+ " 13,\n",
+ " 2,\n",
+ " 5,\n",
+ " 20,\n",
+ " 8,\n",
+ " 3,\n",
+ " 14,\n",
+ " 4,\n",
+ " 5,\n",
+ " 0,\n",
+ " 5,\n",
+ " 0,\n",
+ " 19,\n",
+ " 19,\n",
+ " 4,\n",
+ " 12,\n",
+ " 20,\n",
+ " 8,\n",
+ " 12,\n",
+ " 13,\n",
+ " 5,\n",
+ " 11,\n",
+ " 25,\n",
+ " 13,\n",
+ " 1,\n",
+ " 4,\n",
+ " 10,\n",
+ " 14,\n",
+ " 5,\n",
+ " 14,\n",
+ " 1,\n",
+ " 17,\n",
+ " 11,\n",
+ " 8,\n",
+ " 0,\n",
+ " 4,\n",
+ " 7,\n",
+ " 7,\n",
+ " 0,\n",
+ " 20,\n",
+ " 8,\n",
+ " 7,\n",
+ " 13,\n",
+ " 13,\n",
+ " 13,\n",
+ " 22,\n",
+ " 25,\n",
+ " 0,\n",
+ " 4,\n",
+ " 4,\n",
+ " 21,\n",
+ " 19,\n",
+ " 11,\n",
+ " 11,\n",
+ " 19,\n",
+ " 15,\n",
+ " 0,\n",
+ " 0,\n",
+ " 11,\n",
+ " 13,\n",
+ " 0,\n",
+ " 13,\n",
+ " 21,\n",
+ " 19,\n",
+ " 25,\n",
+ " 11,\n",
+ " 25,\n",
+ " 20,\n",
+ " 20,\n",
+ " 2,\n",
+ " 15,\n",
+ " 19,\n",
+ " 0,\n",
+ " 4,\n",
+ " 11,\n",
+ " 8,\n",
+ " 13,\n",
+ " 0,\n",
+ " 13,\n",
+ " 15,\n",
+ " 0,\n",
+ " 0,\n",
+ " 7,\n",
+ " 4,\n",
+ " 22,\n",
+ " 5,\n",
+ " 19,\n",
+ " 7,\n",
+ " 0,\n",
+ " 14,\n",
+ " 18,\n",
+ " 4,\n",
+ " 19,\n",
+ " 0,\n",
+ " 17,\n",
+ " 8,\n",
+ " 1,\n",
+ " 13,\n",
+ " 1,\n",
+ " 13,\n",
+ " 21,\n",
+ " 7,\n",
+ " 0,\n",
+ " 4,\n",
+ " 21,\n",
+ " 3,\n",
+ " 7,\n",
+ " 24,\n",
+ " 24,\n",
+ " 19,\n",
+ " 11,\n",
+ " 12,\n",
+ " 20,\n",
+ " 23,\n",
+ " 1]"
+ ]
+ },
+ "execution_count": 17,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 107,
- "text": [
- "-11.000000000000002"
- ]
- }
- ],
- "prompt_number": 107
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "c6b_nums = [ord(c) - ord('a') for c in c6bs]\n",
+ "c6b_nums"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 106,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "m.I"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 7, 8],\n",
+ " [11, 11]])"
+ ]
+ },
+ "execution_count": 106,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 108,
- "text": [
- "matrix([[-1. , 0.72727273],\n",
- " [ 1. , -0.63636364]])"
- ]
- }
- ],
- "prompt_number": 108
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "m = np.matrix([[7,8], [11,11]])\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "v = np.matrix([[7], [22]])\n",
- "v"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "-11.000000000000002"
+ ]
+ },
+ "execution_count": 107,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 37,
- "text": [
- "matrix([[ 7],\n",
- " [22]])"
- ]
- }
- ],
- "prompt_number": 37
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.linalg.det(m)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "c = (m*v) % 26\n",
- "c"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[-1. , 0.72727273],\n",
+ " [ 1. , -0.63636364]])"
+ ]
+ },
+ "execution_count": 108,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 46,
- "text": [
- "matrix([[9],\n",
- " [5]])"
- ]
- }
- ],
- "prompt_number": 46
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "m.I"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "np.linalg.solve(m, c) % 26"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 7],\n",
+ " [22]])"
+ ]
+ },
+ "execution_count": 37,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 48,
- "text": [
- "matrix([[ 7.],\n",
- " [ 22.]])"
- ]
- }
- ],
- "prompt_number": 48
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "v = np.matrix([[7], [22]])\n",
+ "v"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "m*v"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[9],\n",
+ " [5]])"
+ ]
+ },
+ "execution_count": 46,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 40,
- "text": [
- "matrix([[ 87],\n",
- " [109]])"
- ]
- }
- ],
- "prompt_number": 40
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "c = (m*v) % 26\n",
+ "c"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "(m*v)%26"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 7.],\n",
+ " [ 22.]])"
+ ]
+ },
+ "execution_count": 48,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 41,
- "text": [
- "matrix([[9],\n",
- " [5]])"
- ]
- }
- ],
- "prompt_number": 41
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.linalg.solve(m, c) % 26"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "np.linalg.solve(m, (m*v)%26)%26"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 87],\n",
+ " [109]])"
+ ]
+ },
+ "execution_count": 40,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 42,
- "text": [
- "matrix([[ 7.],\n",
- " [ 22.]])"
- ]
- }
- ],
- "prompt_number": 42
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "m*v"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "len(m)"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[9],\n",
+ " [5]])"
+ ]
+ },
+ "execution_count": 41,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 51,
- "text": [
- "2"
- ]
- }
- ],
- "prompt_number": 51
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(m*v)%26"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "def hill_encipher(matrix, message_letters, fillvalue='a'):\n",
- " n = len(matrix)\n",
- " sanitised_message = sanitise(message_letters)\n",
- " if len(sanitised_message) % n != 0:\n",
- " padding = fillvalue[0] * (n - len(sanitised_message) % n)\n",
- " else:\n",
- " padding = ''\n",
- " message = [ord(c) - ord('a') for c in sanitised_message + padding]\n",
- " message_chunks = [message[i:i+n] for i in range(0, len(message), n)]\n",
- " # message_chunks = chunks(message, len(matrix), fillvalue=None)\n",
- " enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0] for c in message_chunks]\n",
- " return ''.join([chr(int(round(l)) % 26 + ord('a')) for l in sum(enciphered_chunks, [])])"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 7.],\n",
+ " [ 22.]])"
+ ]
+ },
+ "execution_count": 42,
"metadata": {},
- "outputs": [],
- "prompt_number": 181
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.linalg.solve(m, (m*v)%26)%26"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_encipher(m, 'hellothere')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "execution_count": 51,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 156,
- "text": [
- "'drjiqzdrvx'"
- ]
- }
- ],
- "prompt_number": 156
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(m)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 181,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "def hill_encipher(matrix, message_letters, fillvalue='a'):\n",
+ " n = len(matrix)\n",
+ " sanitised_message = sanitise(message_letters)\n",
+ " if len(sanitised_message) % n != 0:\n",
+ " padding = fillvalue[0] * (n - len(sanitised_message) % n)\n",
+ " else:\n",
+ " padding = ''\n",
+ " message = [ord(c) - ord('a') for c in sanitised_message + padding]\n",
+ " message_chunks = [message[i:i+n] for i in range(0, len(message), n)]\n",
+ " # message_chunks = chunks(message, len(matrix), fillvalue=None)\n",
+ " enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0] for c in message_chunks]\n",
+ " return ''.join([chr(int(round(l)) % 26 + ord('a')) for l in sum(enciphered_chunks, [])])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 156,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "msg = [ord(c) - ord('a') for c in 'hellothere']\n",
- "msg"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'drjiqzdrvx'"
+ ]
+ },
+ "execution_count": 156,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 68,
- "text": [
- "[7, 4, 11, 11, 14, 19, 7, 4, 17, 4]"
- ]
- }
- ],
- "prompt_number": 68
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_encipher(m, 'hellothere')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "msgc = [msg[i:i+len(m)] for i in range(0, len(msg), len(m))]\n",
- "msgc"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[7, 4, 11, 11, 14, 19, 7, 4, 17, 4]"
+ ]
+ },
+ "execution_count": 68,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 112,
- "text": [
- "[[7, 11], [14, 25], [21, 14], [7, 11], [11, 15], [0, 0]]"
- ]
- }
- ],
- "prompt_number": 112
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "msg = [ord(c) - ord('a') for c in 'hellothere']\n",
+ "msg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 112,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "((m*np.matrix(msgc[0]).T).T % 26).tolist()[0]"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[[7, 11], [14, 25], [21, 14], [7, 11], [11, 15], [0, 0]]"
+ ]
+ },
+ "execution_count": 112,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 87,
- "text": [
- "[7, 11]"
- ]
- }
- ],
- "prompt_number": 87
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "msgc = [msg[i:i+len(m)] for i in range(0, len(msg), len(m))]\n",
+ "msgc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 87,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "def hill_decipher(matrix, message, fillvalue='a'):\n",
- " adjugate = linalg.det(matrix)*linalg.inv(matrix)\n",
- " inverse_determinant = modular_division_table[int(round(linalg.det(matrix))) % 26][1]\n",
- " inverse_matrix = (inverse_determinant * adjugate) % 26\n",
- " return hill_encipher(inverse_matrix, message, fillvalue) "
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[7, 11]"
+ ]
+ },
+ "execution_count": 87,
"metadata": {},
- "outputs": [],
- "prompt_number": 195
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "((m*np.matrix(msgc[0]).T).T % 26).tolist()[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 195,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "def hill_decipher(matrix, message, fillvalue='a'):\n",
+ " adjugate = linalg.det(matrix)*linalg.inv(matrix)\n",
+ " inverse_determinant = modular_division_table[int(round(linalg.det(matrix))) % 26][1]\n",
+ " inverse_matrix = (inverse_determinant * adjugate) % 26\n",
+ " return hill_encipher(inverse_matrix, message, fillvalue) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 161,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_decipher(m, 'drjiqzdrvx')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'hellothere'"
+ ]
+ },
+ "execution_count": 161,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 161,
- "text": [
- "'hellothere'"
- ]
- }
- ],
- "prompt_number": 161
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_decipher(m, 'drjiqzdrvx')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 114,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "msg = [ord(c) - ord('a') for c in 'drjiqzdrvxaa']\n",
- "msg"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[3, 17, 9, 8, 16, 25, 3, 17, 21, 23, 0, 0]"
+ ]
+ },
+ "execution_count": 114,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 114,
- "text": [
- "[3, 17, 9, 8, 16, 25, 3, 17, 21, 23, 0, 0]"
- ]
- }
- ],
- "prompt_number": 114
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "msg = [ord(c) - ord('a') for c in 'drjiqzdrvxaa']\n",
+ "msg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 115,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "msgc = [msg[i:i+len(m)] for i in range(0, len(msg), len(m))]\n",
- "msgc"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[[3, 17], [9, 8], [16, 25], [3, 17], [21, 23], [0, 0]]"
+ ]
+ },
+ "execution_count": 115,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 115,
- "text": [
- "[[3, 17], [9, 8], [16, 25], [3, 17], [21, 23], [0, 0]]"
- ]
- }
- ],
- "prompt_number": 115
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "msgc = [msg[i:i+len(m)] for i in range(0, len(msg), len(m))]\n",
+ "msgc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 116,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "(np.linalg.solve(m, np.matrix(msgc[0]).T).T % 26)"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 9.36363636, 18.18181818]])"
+ ]
+ },
+ "execution_count": 116,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 116,
- "text": [
- "matrix([[ 9.36363636, 18.18181818]])"
- ]
- }
- ],
- "prompt_number": 116
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(np.linalg.solve(m, np.matrix(msgc[0]).T).T % 26)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "m_adj = linalg.det(m)*linalg.inv(m)\n",
- "m_adj"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 11., -8.],\n",
+ " [-11., 7.]])"
+ ]
+ },
+ "execution_count": 142,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 142,
- "text": [
- "matrix([[ 11., -8.],\n",
- " [-11., 7.]])"
- ]
- }
- ],
- "prompt_number": 142
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "m_adj = linalg.det(m)*linalg.inv(m)\n",
+ "m_adj"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 148,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "modular_division_table[int(round(linalg.det(m))) % 26][1]"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "7"
+ ]
+ },
+ "execution_count": 148,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 148,
- "text": [
- "7"
- ]
- }
- ],
- "prompt_number": 148
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "modular_division_table[int(round(linalg.det(m))) % 26][1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 150,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "m_inv = (modular_division_table[int(round(linalg.det(m))) % 26][1] * m_adj) % 26\n",
- "m_inv"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 25., 22.],\n",
+ " [ 1., 23.]])"
+ ]
+ },
+ "execution_count": 150,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 150,
- "text": [
- "matrix([[ 25., 22.],\n",
- " [ 1., 23.]])"
- ]
- }
- ],
- "prompt_number": 150
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "m_inv = (modular_division_table[int(round(linalg.det(m))) % 26][1] * m_adj) % 26\n",
+ "m_inv"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 157,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_encipher(m_inv, 'drjiqzdrvx')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'hellothere'"
+ ]
+ },
+ "execution_count": 157,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 157,
- "text": [
- "'hellothere'"
- ]
- }
- ],
- "prompt_number": 157
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_encipher(m_inv, 'drjiqzdrvx')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "np.dot(m , 1/linalg.det(m) * mc)"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 1., 0.],\n",
+ " [ 0., 1.]])"
+ ]
+ },
+ "execution_count": 120,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 120,
- "text": [
- "matrix([[ 1., 0.],\n",
- " [ 0., 1.]])"
- ]
- }
- ],
- "prompt_number": 120
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.dot(m , 1/linalg.det(m) * mc)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 122,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "ml = np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]])\n",
- "ml"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 6, 24, 1],\n",
+ " [13, 16, 10],\n",
+ " [20, 17, 15]])"
+ ]
+ },
+ "execution_count": 122,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 122,
- "text": [
- "matrix([[ 6, 24, 1],\n",
- " [13, 16, 10],\n",
- " [20, 17, 15]])"
- ]
- }
- ],
- "prompt_number": 122
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ml = np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]])\n",
+ "ml"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 137,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "ml_adj = linalg.det(ml)*linalg.inv(ml) % 26\n",
- "ml_adj"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 18., 21., 16.],\n",
+ " [ 5., 18., 5.],\n",
+ " [ 5., 14., 18.]])"
+ ]
+ },
+ "execution_count": 137,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 137,
- "text": [
- "matrix([[ 18., 21., 16.],\n",
- " [ 5., 18., 5.],\n",
- " [ 5., 14., 18.]])"
- ]
- }
- ],
- "prompt_number": 137
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ml_adj = linalg.det(ml)*linalg.inv(ml) % 26\n",
+ "ml_adj"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 138,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "modular_division_table[int(linalg.det(ml) % 26)][1]"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "25"
+ ]
+ },
+ "execution_count": 138,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 138,
- "text": [
- "25"
- ]
- }
- ],
- "prompt_number": 138
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "modular_division_table[int(linalg.det(ml) % 26)][1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 139,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "ml_inv = (modular_division_table[int(linalg.det(ml) % 26)][1] * ml_adj) % 26\n",
- "ml_inv"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "matrix([[ 8., 5., 10.],\n",
+ " [ 21., 8., 21.],\n",
+ " [ 21., 12., 8.]])"
+ ]
+ },
+ "execution_count": 139,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 139,
- "text": [
- "matrix([[ 8., 5., 10.],\n",
- " [ 21., 8., 21.],\n",
- " [ 21., 12., 8.]])"
- ]
- }
- ],
- "prompt_number": 139
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ml_inv = (modular_division_table[int(linalg.det(ml) % 26)][1] * ml_adj) % 26\n",
+ "ml_inv"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 193,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_encipher(ml, 'hello there')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'tfjflpznvyac'"
+ ]
+ },
+ "execution_count": 193,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 193,
- "text": [
- "'tfjflpznvyac'"
- ]
- }
- ],
- "prompt_number": 193
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_encipher(ml, 'hello there')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 196,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_decipher(ml, 'tfjflpznvyac')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'hellothereaa'"
+ ]
+ },
+ "execution_count": 196,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 196,
- "text": [
- "'hellothereaa'"
- ]
- }
- ],
- "prompt_number": 196
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_decipher(ml, 'tfjflpznvyac')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 182,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_encipher(ml, 'act')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'poh'"
+ ]
+ },
+ "execution_count": 182,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 182,
- "text": [
- "'poh'"
- ]
- }
- ],
- "prompt_number": 182
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_encipher(ml, 'act')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 192,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_decipher(ml, 'poh')"
- ],
- "language": "python",
- "metadata": {},
- "outputs": [
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "[[ 8. 5. 10.]\n",
- " [ 21. 8. 21.]\n",
- " [ 21. 12. 8.]]\n"
- ]
- },
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 192,
- "text": [
- "'act'"
- ]
- }
- ],
- "prompt_number": 192
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[ 8. 5. 10.]\n",
+ " [ 21. 8. 21.]\n",
+ " [ 21. 12. 8.]]\n"
+ ]
},
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "[chr(int(round(i)) % 26 + ord('a')) for i in (ml_inv * np.matrix([ord(c) - ord('a') for c in 'poh']).T).T.tolist()[0]]"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'act'"
+ ]
+ },
+ "execution_count": 192,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 180,
- "text": [
- "['a', 'c', 't']"
- ]
- }
- ],
- "prompt_number": 180
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_decipher(ml, 'poh')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 180,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "hill_encipher(ml_inv, 'poh')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "['a', 'c', 't']"
+ ]
+ },
+ "execution_count": 180,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 184,
- "text": [
- "'act'"
- ]
- }
- ],
- "prompt_number": 184
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "[chr(int(round(i)) % 26 + ord('a')) for i in (ml_inv * np.matrix([ord(c) - ord('a') for c in 'poh']).T).T.tolist()[0]]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "len([list(m) for m in itertools.product([list(r) for r in itertools.product(range(26), repeat=3)], repeat=3)])"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "'act'"
+ ]
+ },
+ "execution_count": 184,
"metadata": {},
- "outputs": [
- {
- "ename": "KeyboardInterrupt",
- "evalue": "",
- "output_type": "pyerr",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
- "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
- ]
- }
- ],
- "prompt_number": 203
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_encipher(ml_inv, 'poh')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 203,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "(3**3)**3"
- ],
- "language": "python",
- "metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 202,
- "text": [
- "19683"
- ]
- }
- ],
- "prompt_number": 202
- },
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
+ "source": [
+ "len([list(m) for m in itertools.product([list(r) for r in itertools.product(range(26), repeat=3)], repeat=3)])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 202,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "[np.matrix(list(m)) for m in itertools.product([list(r) for r in itertools.product(range(3), repeat=2)], repeat=2)]"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "19683"
+ ]
+ },
+ "execution_count": 202,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 206,
- "text": [
- "[matrix([[0, 0],\n",
- " [0, 0]]), matrix([[0, 0],\n",
- " [0, 1]]), matrix([[0, 0],\n",
- " [0, 2]]), matrix([[0, 0],\n",
- " [1, 0]]), matrix([[0, 0],\n",
- " [1, 1]]), matrix([[0, 0],\n",
- " [1, 2]]), matrix([[0, 0],\n",
- " [2, 0]]), matrix([[0, 0],\n",
- " [2, 1]]), matrix([[0, 0],\n",
- " [2, 2]]), matrix([[0, 1],\n",
- " [0, 0]]), matrix([[0, 1],\n",
- " [0, 1]]), matrix([[0, 1],\n",
- " [0, 2]]), matrix([[0, 1],\n",
- " [1, 0]]), matrix([[0, 1],\n",
- " [1, 1]]), matrix([[0, 1],\n",
- " [1, 2]]), matrix([[0, 1],\n",
- " [2, 0]]), matrix([[0, 1],\n",
- " [2, 1]]), matrix([[0, 1],\n",
- " [2, 2]]), matrix([[0, 2],\n",
- " [0, 0]]), matrix([[0, 2],\n",
- " [0, 1]]), matrix([[0, 2],\n",
- " [0, 2]]), matrix([[0, 2],\n",
- " [1, 0]]), matrix([[0, 2],\n",
- " [1, 1]]), matrix([[0, 2],\n",
- " [1, 2]]), matrix([[0, 2],\n",
- " [2, 0]]), matrix([[0, 2],\n",
- " [2, 1]]), matrix([[0, 2],\n",
- " [2, 2]]), matrix([[1, 0],\n",
- " [0, 0]]), matrix([[1, 0],\n",
- " [0, 1]]), matrix([[1, 0],\n",
- " [0, 2]]), matrix([[1, 0],\n",
- " [1, 0]]), matrix([[1, 0],\n",
- " [1, 1]]), matrix([[1, 0],\n",
- " [1, 2]]), matrix([[1, 0],\n",
- " [2, 0]]), matrix([[1, 0],\n",
- " [2, 1]]), matrix([[1, 0],\n",
- " [2, 2]]), matrix([[1, 1],\n",
- " [0, 0]]), matrix([[1, 1],\n",
- " [0, 1]]), matrix([[1, 1],\n",
- " [0, 2]]), matrix([[1, 1],\n",
- " [1, 0]]), matrix([[1, 1],\n",
- " [1, 1]]), matrix([[1, 1],\n",
- " [1, 2]]), matrix([[1, 1],\n",
- " [2, 0]]), matrix([[1, 1],\n",
- " [2, 1]]), matrix([[1, 1],\n",
- " [2, 2]]), matrix([[1, 2],\n",
- " [0, 0]]), matrix([[1, 2],\n",
- " [0, 1]]), matrix([[1, 2],\n",
- " [0, 2]]), matrix([[1, 2],\n",
- " [1, 0]]), matrix([[1, 2],\n",
- " [1, 1]]), matrix([[1, 2],\n",
- " [1, 2]]), matrix([[1, 2],\n",
- " [2, 0]]), matrix([[1, 2],\n",
- " [2, 1]]), matrix([[1, 2],\n",
- " [2, 2]]), matrix([[2, 0],\n",
- " [0, 0]]), matrix([[2, 0],\n",
- " [0, 1]]), matrix([[2, 0],\n",
- " [0, 2]]), matrix([[2, 0],\n",
- " [1, 0]]), matrix([[2, 0],\n",
- " [1, 1]]), matrix([[2, 0],\n",
- " [1, 2]]), matrix([[2, 0],\n",
- " [2, 0]]), matrix([[2, 0],\n",
- " [2, 1]]), matrix([[2, 0],\n",
- " [2, 2]]), matrix([[2, 1],\n",
- " [0, 0]]), matrix([[2, 1],\n",
- " [0, 1]]), matrix([[2, 1],\n",
- " [0, 2]]), matrix([[2, 1],\n",
- " [1, 0]]), matrix([[2, 1],\n",
- " [1, 1]]), matrix([[2, 1],\n",
- " [1, 2]]), matrix([[2, 1],\n",
- " [2, 0]]), matrix([[2, 1],\n",
- " [2, 1]]), matrix([[2, 1],\n",
- " [2, 2]]), matrix([[2, 2],\n",
- " [0, 0]]), matrix([[2, 2],\n",
- " [0, 1]]), matrix([[2, 2],\n",
- " [0, 2]]), matrix([[2, 2],\n",
- " [1, 0]]), matrix([[2, 2],\n",
- " [1, 1]]), matrix([[2, 2],\n",
- " [1, 2]]), matrix([[2, 2],\n",
- " [2, 0]]), matrix([[2, 2],\n",
- " [2, 1]]), matrix([[2, 2],\n",
- " [2, 2]])]"
- ]
- }
- ],
- "prompt_number": 206
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(3**3)**3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 206,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "all_matrices = [np.matrix(list(m)) for m in itertools.product([list(r) for r in itertools.product(range(26), repeat=2)], repeat=2)]\n",
- "valid_matrices = [m for m, d in zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))\n",
- " if d != 0\n",
- " if d % 2 != 0\n",
- " if d % 13 != 0 ]\n",
- "len(valid_matrices)"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "[matrix([[0, 0],\n",
+ " [0, 0]]), matrix([[0, 0],\n",
+ " [0, 1]]), matrix([[0, 0],\n",
+ " [0, 2]]), matrix([[0, 0],\n",
+ " [1, 0]]), matrix([[0, 0],\n",
+ " [1, 1]]), matrix([[0, 0],\n",
+ " [1, 2]]), matrix([[0, 0],\n",
+ " [2, 0]]), matrix([[0, 0],\n",
+ " [2, 1]]), matrix([[0, 0],\n",
+ " [2, 2]]), matrix([[0, 1],\n",
+ " [0, 0]]), matrix([[0, 1],\n",
+ " [0, 1]]), matrix([[0, 1],\n",
+ " [0, 2]]), matrix([[0, 1],\n",
+ " [1, 0]]), matrix([[0, 1],\n",
+ " [1, 1]]), matrix([[0, 1],\n",
+ " [1, 2]]), matrix([[0, 1],\n",
+ " [2, 0]]), matrix([[0, 1],\n",
+ " [2, 1]]), matrix([[0, 1],\n",
+ " [2, 2]]), matrix([[0, 2],\n",
+ " [0, 0]]), matrix([[0, 2],\n",
+ " [0, 1]]), matrix([[0, 2],\n",
+ " [0, 2]]), matrix([[0, 2],\n",
+ " [1, 0]]), matrix([[0, 2],\n",
+ " [1, 1]]), matrix([[0, 2],\n",
+ " [1, 2]]), matrix([[0, 2],\n",
+ " [2, 0]]), matrix([[0, 2],\n",
+ " [2, 1]]), matrix([[0, 2],\n",
+ " [2, 2]]), matrix([[1, 0],\n",
+ " [0, 0]]), matrix([[1, 0],\n",
+ " [0, 1]]), matrix([[1, 0],\n",
+ " [0, 2]]), matrix([[1, 0],\n",
+ " [1, 0]]), matrix([[1, 0],\n",
+ " [1, 1]]), matrix([[1, 0],\n",
+ " [1, 2]]), matrix([[1, 0],\n",
+ " [2, 0]]), matrix([[1, 0],\n",
+ " [2, 1]]), matrix([[1, 0],\n",
+ " [2, 2]]), matrix([[1, 1],\n",
+ " [0, 0]]), matrix([[1, 1],\n",
+ " [0, 1]]), matrix([[1, 1],\n",
+ " [0, 2]]), matrix([[1, 1],\n",
+ " [1, 0]]), matrix([[1, 1],\n",
+ " [1, 1]]), matrix([[1, 1],\n",
+ " [1, 2]]), matrix([[1, 1],\n",
+ " [2, 0]]), matrix([[1, 1],\n",
+ " [2, 1]]), matrix([[1, 1],\n",
+ " [2, 2]]), matrix([[1, 2],\n",
+ " [0, 0]]), matrix([[1, 2],\n",
+ " [0, 1]]), matrix([[1, 2],\n",
+ " [0, 2]]), matrix([[1, 2],\n",
+ " [1, 0]]), matrix([[1, 2],\n",
+ " [1, 1]]), matrix([[1, 2],\n",
+ " [1, 2]]), matrix([[1, 2],\n",
+ " [2, 0]]), matrix([[1, 2],\n",
+ " [2, 1]]), matrix([[1, 2],\n",
+ " [2, 2]]), matrix([[2, 0],\n",
+ " [0, 0]]), matrix([[2, 0],\n",
+ " [0, 1]]), matrix([[2, 0],\n",
+ " [0, 2]]), matrix([[2, 0],\n",
+ " [1, 0]]), matrix([[2, 0],\n",
+ " [1, 1]]), matrix([[2, 0],\n",
+ " [1, 2]]), matrix([[2, 0],\n",
+ " [2, 0]]), matrix([[2, 0],\n",
+ " [2, 1]]), matrix([[2, 0],\n",
+ " [2, 2]]), matrix([[2, 1],\n",
+ " [0, 0]]), matrix([[2, 1],\n",
+ " [0, 1]]), matrix([[2, 1],\n",
+ " [0, 2]]), matrix([[2, 1],\n",
+ " [1, 0]]), matrix([[2, 1],\n",
+ " [1, 1]]), matrix([[2, 1],\n",
+ " [1, 2]]), matrix([[2, 1],\n",
+ " [2, 0]]), matrix([[2, 1],\n",
+ " [2, 1]]), matrix([[2, 1],\n",
+ " [2, 2]]), matrix([[2, 2],\n",
+ " [0, 0]]), matrix([[2, 2],\n",
+ " [0, 1]]), matrix([[2, 2],\n",
+ " [0, 2]]), matrix([[2, 2],\n",
+ " [1, 0]]), matrix([[2, 2],\n",
+ " [1, 1]]), matrix([[2, 2],\n",
+ " [1, 2]]), matrix([[2, 2],\n",
+ " [2, 0]]), matrix([[2, 2],\n",
+ " [2, 1]]), matrix([[2, 2],\n",
+ " [2, 2]])]"
+ ]
+ },
+ "execution_count": 206,
"metadata": {},
- "outputs": [
- {
- "metadata": {},
- "output_type": "pyout",
- "prompt_number": 215,
- "text": [
- "157248"
- ]
- }
- ],
- "prompt_number": 215
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "[np.matrix(list(m)) for m in itertools.product([list(r) for r in itertools.product(range(3), repeat=2)], repeat=2)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 215,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "%%timeit\n",
- "[m for m, d in zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))\n",
- " if d != 0\n",
- " if d % 2 != 0\n",
- " if d % 13 != 0 ]\n",
- "print('done')"
- ],
- "language": "python",
+ "data": {
+ "text/plain": [
+ "157248"
+ ]
+ },
+ "execution_count": 215,
"metadata": {},
- "outputs": [
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "done\n",
- "done"
- ]
- },
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "\n",
- "done"
- ]
- },
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "\n",
- "done"
- ]
- },
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "\n",
- "1 loops, best of 3: 10 s per loop\n"
- ]
- }
- ],
- "prompt_number": 216
- },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "all_matrices = [np.matrix(list(m)) for m in itertools.product([list(r) for r in itertools.product(range(26), repeat=2)], repeat=2)]\n",
+ "valid_matrices = [m for m, d in zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))\n",
+ " if d != 0\n",
+ " if d % 2 != 0\n",
+ " if d % 13 != 0 ]\n",
+ "len(valid_matrices)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 216,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [
- "%%timeit\n",
- "[m for m in all_matrices\n",
- " if int(round(linalg.det(m))) != 0\n",
- " if int(round(linalg.det(m))) % 2 != 0\n",
- " if int(round(linalg.det(m))) % 13 != 0 ]\n",
- "print('done')"
- ],
- "language": "python",
- "metadata": {},
- "outputs": [
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "done\n",
- "done"
- ]
- },
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "\n",
- "done"
- ]
- },
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "\n",
- "done"
- ]
- },
- {
- "output_type": "stream",
- "stream": "stdout",
- "text": [
- "\n",
- "1 loops, best of 3: 20.4 s per loop\n"
- ]
- }
- ],
- "prompt_number": 217
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "done\n",
+ "done\n",
+ "done\n",
+ "done\n",
+ "1 loops, best of 3: 10 s per loop\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%timeit\n",
+ "[m for m, d in zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))\n",
+ " if d != 0\n",
+ " if d % 2 != 0\n",
+ " if d % 13 != 0 ]\n",
+ "print('done')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 217,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
{
- "cell_type": "code",
- "collapsed": false,
- "input": [],
- "language": "python",
- "metadata": {},
- "outputs": []
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "done\n",
+ "done\n",
+ "done\n",
+ "done\n",
+ "1 loops, best of 3: 20.4 s per loop\n"
+ ]
}
],
- "metadata": {}
+ "source": [
+ "%%timeit\n",
+ "[m for m in all_matrices\n",
+ " if int(round(linalg.det(m))) != 0\n",
+ " if int(round(linalg.det(m))) % 2 != 0\n",
+ " if int(round(linalg.det(m))) % 13 != 0 ]\n",
+ "print('done')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": []
}
- ]
-}
\ No newline at end of file
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.5.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}