Creativity and computer algebra

Oliver Knill, Harvard University, July 5, 2018

This article has appeared on July 5, 2018 in medium.com:
A computer algebra component in a calculus or a linear algebra course is a perfect opportunity to explore creativity and the connections of mathematics with other arts and sciences. It leads to connections of mathematics with other parts. We illustrate this here with Music, Poetry, Sculpture and Puzzles. While many mathematicians perceive Math as part of art itself, the stories can illustrate how the connections can be enhanced with the help of a mathematical computer algebra system. We see that in music, we could generate canons, in poetry find poem prototypes, in sculpture realize mathematical objects and at last in puzzles, see how analyzing puzzles can lead to interesting conjectures.

Linear algebra and Music

We have had used some music component in the final Mathematica project for a while now in linear algebra courses. Here is an exhibit from 2008. It had been amazing also this year to see the creativity of students. See an exhibit. One can always learn from students. In the workshop, (Here are some slides), I gave the following template for a Canon
f={1,1,3,3,5,5,1,1,1,1,3,3,5,5,1,1,5,5,6,6,8,8,8,8,5,5,6,6,8,
   8,8,8,8,10,8,6,5,5,1,1,8,10,8,6,5,5,1,1,3,3,-4,-4,1,1,1,1};
A = Map[SoundNote, f];
s1 = Sound[{"Piano",              A},     {0, 24}];
s2 = Sound[{"Flute",  RotateRight[A, 8]}, {0, 24}];
s3 = Sound[{"Guitar", RotateRight[A, 16]},{0, 24}];
S = Sound[{s1, s2, s3}, {0, 12}]
Export["brother_john.midi",S,"MIDI"]
Export["brother_john.mp3",S,"MP3"]
[MP3] This simple example illustrates how one can join several music 'tracks'. After reading student submissions, I learned that the repetitive part can be avoided by putting "None". Here is a variation, where also the instruments have been replaced:
n=None; f={1,n,3,n,5,n,1,n,n,n,3,n,5,n,1,n,5,n,6,n,8,n,n,n,5,n,6,n,8,
   n,n,n,n,10,8,6,5,n,1,n,8,10,8,6,5,n,1,n,3,n,-4,-4,1,n,1,n};
A  = Map[SoundNote, f];
s1 = Sound[{"Voice", A}, {0, 24}];
s2 = Sound[{"VoiceOohs", RotateRight[A, 8]}, {0, 24}];
s3 = Sound[{"VoiceAahs", RotateRight[A, 16]}, {0, 24}];
s4 = Sound[{"Taiko", A}, {8, 32}];
s5 = Sound[{"Timpani", RotateRight[A, 8]}, {8, 32}];
s6 = Sound[{"Woodblock", RotateRight[A, 16]}, {8, 32}];
S = Sound[{s1, s2, s3, s4, s5, s6}, {0, 10}]
[MP3] Is the use of computers to generate music not defeating the process of creativity? One can definitely argue that way, but one can also see the computer as an additional music instrument, as a tool to be creative. Lets try to be creative by applying small changes to the above code. The assignment for the constant n for example could be replaced by a function, which repeats after the period of the canon.
q:=RandomChoice[{1,3,5,8}]; 
M=Table[q,{8}]; k=0;n:=Module[{},k++;M[[Mod[k,8]+1]]];
f={1,n,3,n,5,n,1,n,n,n,3,n,5,n,1,n,5,n,6,n,8,n,n,n,5,n,6,n,8,
   n,n,n,n,10,8,6,5,n,1,n,8,10,8,6,5,n,1,n,3,n,-4,-4,1,n,1,n};
A  = Map[SoundNote, f];
s1 = Sound[{"Strings", A}, {0, 24}];
s2 = Sound[{"Strings2", RotateRight[A, 8]}, {0, 24}];
s3 = Sound[{"SynthStrings", RotateRight[A, 16]}, {0, 24}];
S = Sound[{s1, s2, s3}, {0, 10}]
[MP3] A more sophisticated task is to build three melodies, A,B,C which fit together, then build the canon with structure (A,B,C).

By the way, also in single variable, the connection between math and music is strong. Music can explain some calculus concepts like here: here [PDF]. As part of a HILT project funded by a Hauser grant 2013, we designed some Math 1a lectures of interdisciplanary nature which had been filmed by the Bok center here. Music compositions more closely to calculus already in a in 2007 At that time, the music routines which export midi files were not yet developed in Mathematica, so that the song function was built up.

Markov chains and Poetry

Music is not the only domain, where one can experiment with art. We have experimented with random poems. Nandy Millan from the University of Birmingham once wrote a Poem generator A.D.A.M. in Java which we translated a couple of years ago in Mathematica: Here is a Mathematica version which we gave to students asking them to modify (like changing the vocabulary or the rules):
Adjectives = {nice, sad, happy, noisy, cold, beautiful, delicate, shining,
   sweet, soft, graceful, pretty, desiring, silly, fragile, silver, golden,
   graceful, spiritless, heartbroken, sealed, stormy, rusty, frenetic, burning};
Adverbs = {soon, late, desperately, passionately, slowly, softly, carefully, tenderly, 
    gently, quickly, kindly};
Articles = {the, a}; 
Ditverbs = {gave, transformed, told, provided}; 
Opronouns = {me, you, him, her, us, them};    Spronouns = {I, you, he, she, we};
Itverbs = {raised, felt, anguished, shivered, shined, shouted, whispered, danced, dreamed};
Nouns = {heart, mouth, soul, hand, saint, maiden, love, flower, garden, moon, 
   sun, bird, breeze, rose, tulip, misery, despair, passion, desire, warmth, 
   fire, flame, fantasy, wing, kingdom, light, shadow};
Preps = {from, for, with, in} ; Pronouns = {i, you, he, she, it, we, they, me, him, her, us, them};
Tverbs = {loved, hated, wanted, felt, desired, cuddled, greeted, enjoyed};
Verbs = {rose, coped, sang, cried, hoped, shouted, felt, danced, desired, dreamed};
Adjective := RandomChoice[Adjectives]; Adverb   := RandomChoice[Adverbs]; 
Ditverb := RandomChoice[Ditverbs];     Itverb   := RandomChoice[Itverbs]; 
Noun := RandomChoice[Nouns];           Opronoun := RandomChoice[Opronouns];
Prep := RandomChoice[Preps];           Pronoun  := RandomChoice[Pronouns]; 
Spronoun := RandomChoice[Spronouns];   OPronoun := RandomChoice[Opronouns]; 
Tverb := RandomChoice[Tverbs];         Verb     := RandomChoice[Verbs];
Article = RandomChoice[Articles]; 
Subject := RandomChoice[{{Article, Noun}, {Spronoun}, {Article, Adjective, Noun}}];
Predicatelist := {{Adverb}, {Prep, Article, Adjective, Noun}, {Prep, Opronoun}, 
                  {Article, Adjective, Noun}, {Opronoun}, 
                  {Article, Adjective, Noun, Adverb}, {Opronoun, Adverb}, 
                  {Opronoun, Article, Adjective, Noun}};
Verblist := {{Itverb}, {Itverb}, {Itverb}, {Tverb}, {Tverb}, {Tverb}, {Tverb}, {Ditverb}};
Predicate := RandomChoice[ Table[{Verblist[[i]], Predicatelist[[i]]}, {i, Length[Verblist]}]];
Object := RandomChoice[{{}, {Adverb}, {Subject}, {Opronoun}, {Prepsubject}}];
Verbobject := {Verb, Object}; Prepsubject := {Prep, Subject}; Subjectpredicate := {Subject, Predicate};
Continuations := If[Length[Object] + Length[Prep] < 4, {"and", Subjectpredicate}, {}];
Sentence := Flatten[RandomChoice[{{Subject, Verbobject}}]]; 
Verse := Table[Sentence, {5}];
Poem   = Table[Verse,    {3}];
Here are some examples. In the following one, where the student Jorma Goerns had used an adaptation of the above Markov procedure in Mathematica to get ideas, then edited to poem so that it rimes:
He rose passionately
To tackle today's PSET
But then he thought eventually
"Oh, I should have stayed in bed!"

A golden sun was shining
His motivation dying
This function's Fourier series
Remained oh so mysterious!

A deafening cry: Eureka!
Am I not a genius?
He opened Mathematica
And found the Fourier series.
There were many other creative approaches. Garrett Tanzer wrote a discrete Markov process which would use a data base of already existing poems to write a new one
The wide world is wretched.
Speak thy dwelling-place.  
Young winter by itself.
The fluttering storm is heaven's hill.
Forgotten for his own element. 
They brought her dreams.  
In merriment upon the palmy beach.
Sing prison guards at dawn. 
And watched the huddled and dolls. 
And like ivy over the dawn.  
Trembling with surprise. In air.  
The sill of the day the present.
Moved in us, hatching marrow.
It is sometimes hard to see the difference between actual poems and text generated by a machine.

Multivariable calculus and Sculpture

In the multivariable calculus part, the 3D printing component has been successful for several years. I learned a lot from Elizabeth Slavkovsky about this who wrote a thesis about the feasability of 3D printing in the classroom See a text. In the fall of 2012 we were able, thanks to an Elson Family arts initiative grant, to print some projects Student submissions. and Some printed species. Here is an example made by Martin Reindl in 2012 and printed in steel. It costed about 70 dollars. In plastic, it would cost 11 dollars.
Here are some more recent galleries

Computer science and Puzzles

Computer algebra systems are great to attack puzzles. It can feel a bit of like cheating, but it still requires creativity. It is Creativity of a new kind because one has to be creative to write a program which solves a creative task. Here is a puzzle posed by Anna Beliakova, from the university of Zürich, and Dmitrij Nikolenkov from the High school Trogen in Switzerland:
Write down the numbers 1-16 in a row so that the sum of two arbitrary
neighbors is a square number.
Using mindless force and write all the 20922789888000=16! cases to find the solution would be brutal. More elegant is to define the graph where the numbers 1-16 are the vertices and where two vertices x,y are connected if x+y is a square. Then, we have to find a Hamiltonian path. We can do that by hand as 16 has be a boundary point, forcing the other numbers.
F[n_]:=Module[{e={}},Do[If[IntegerQ[Sqrt[x+y]],e=Append[e,x->y]],{x,n-1},{y,x+1,n}];e];
Puzzle[n_]:=FindHamiltonianPath[UndirectedGraph[Graph[F[n]]]] 
Puzzle[16]
The solution is
{16, 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8}
We see that 16+9, 9+7, 7+2, 2+14 etc are all squares. Assume now that you are a puzzle writer and want to find out, for which size of puzzles this works.
Do[If[Length[Puzzle[n]]==0,Print[n]],{n,1,100}]
After seeing the output, you might come up with the conjecture that {1,2,5,6,7,8,9,10,11,12,13,14,18,19,20,21,22,24} is the complete list of all these ``square puzzles" which have no solution. I don't know whether this is true. But you see that without the help of a computer, we could hardly have come up with a confident conjecture. An other modification is to ask
Write down the numbers 1-32 in a circle so that the sum of two arbitrary
neighbors is a square number.
Also this defines a graph in which for every edge (a,b), the sum a+b is a square. The task is to find a Hamiltonian cycle in that graph.
F[n_]:=Module[{e={}},Do[If[IntegerQ[Sqrt[x+y]],
   e=Append[e,x->y]],{x,n-1},{y,x+1,n}];e];
Puzzle[n_]:=FindHamiltonianCycle[UndirectedGraph[Graph[F[n]]]]
S=Graph[UndirectedGraph[F[32]],
    {FormatType -> TraditionalForm, GraphStyle -> "SmallNetwork"}]
Export["graph.png",S,"PNG",ImageSize->1600]       
Puzzle[32]
Here is the solution
{1,15,10,26,23,2,14,22,27,9,16,20,29,7,18,31,5,11,
 25,24,12,13,3,6,30,19,17,32,4,21,28,8}
After running the same experiment for arbitrary puzzles, we can ask that the smallest Hamiltonian circle puzzle has a solution for n=32 and that there is a solution for every n larger or equal than 32. We are not aware that this question has been asked already, nor do we know how hard it would be to prove this.
Do[If[Length[Puzzle[n]]==0,Print[n]],{n,1,100}]
Now, finding a solution to the particular puzzle like for n=1000 would be hard to do without a computer. The solution starts with 1->899 -> 950 -> 11 -> 889 -> 480 ,...

By the way, William Rowan Hamilton, came up with the context of Hamiltonian path when looking at the "icosian game" which asked to find a Hamiltonian cycle in the dodecahedron. Hamilton's puzzle was marketed but never became a commercial success. But it became much more, the concept of Hamiltonian path has enormous impact in mathematics.