10 CLEAR : CLS 11 PRINT "******************************************************************" 12 PRINT 20 PRINT " H A R M O N I C G A M E": 21 22 PRINT " orbit analysis" 23 PRINT " (Anytime q = quit)" 25 PRINT : PRINT 36 PRINT : PRINT "--------------------------------------------------" 38 PRINT "Construct adjacency matrix by entering joined vertices." 39 PRINT "(enter h for a short description; c for credits) " 40 PRINT : PRINT "Number of vertices:"; : INPUT " n = "; Nn$ 41 IF Nn$ = "q" THEN END 42 IF Nn$ = "h" THEN GOTO 2000 43 IF Nn$ = "c" THEN GOTO 3000 46 n = VAL(Nn$) 47 IF n > 25 THEN INPUT "Sorry, must be at most 25. Continue "; nic 48 IF n > 25 THEN GOTO 10 50 DIM X%(n, n), G%(n), Z%(n, n), a%(n, n) 52 DIM AA%(n, n), PK%(2 ^ ((n + 1) / 2), 2) 54 DIM IX$(n) 70 FOR i = 1 TO n 80 AA%(i, i) = 1 90 FOR j = 0 TO i - 1 100 AA%(i, j) = 0: AA%(j, i) = 0 110 NEXT 120 NEXT 130 DEF FNB (T) = 1 + (T = 2 * INT(T / 2)) 134 PRINT : PRINT 140 PRINT "Enter joined edges i and j.": PRINT : PRINT 150 PRINT " r=run d=delete an edge s=see edges" 151 INPUT "i"; h$: 152 IF h$ = "s" THEN HH = 1: GOSUB 1410 153 IF h$ = "q" THEN END 160 IF h$ = "r" THEN 250 170 IF h$ <> "d" THEN 200 180 PRINT : PRINT "which edge is to be deleted? (input i,j)" 190 INPUT "i,j"; i, j: X%(i, j) = 0: X%(j, i) = 0: 191 PRINT : PRINT "continue input of edges": GOTO 150 200 i = VAL(h$): IF i > n OR i = 0 THEN PRINT "enter edge": GOTO 150 210 INPUT "j"; j: IF j > n OR j = 0 OR j = i THEN PRINT "enter edge": GOTO 150 220 X%(i, j) = 1: X%(j, i) = 1 240 GOTO 150 250 FOR i = 1 TO n 260 FOR j = 1 TO n 270 V% = V% + X%(i, j) 280 NEXT 290 X%(i, i) = FNB(V%): V% = 0 300 NEXT 310 FOR i = 1 TO 3 320 READ IX$(i) 330 NEXT 340 JJ = 0 350 DATA "nc","t","p" 360 r$ = "pp": PP = 1: PRINT : PRINT 370 GOTO 430 380 IF JJ = 1 THEN INPUT r$ 390 JJ = JJ + 1: r$ = IX$(JJ) 400 IF r$ = "nc" THEN GOSUB 440: GOSUB 500: GOTO 380 410 IF r$ = "t" THEN GOSUB 1090: GOTO 380 420 IF r$ = "p" THEN GOTO 1190 430 IF r$ = "pp" THEN GOSUB 590: GOTO 380 440 DIM KD%(NI + 1): FOR PP = 1 TO NI 450 KD%(PP) = PK%(PP, 1) 460 NEXT 470 PRINT "------- null space dimensions ---------------------" 480 PRINT : FOR i = 1 TO NI: PRINT KD%(i); : NEXT 490 PRINT : RETURN 500 DIM PD%(PI + 1) 510 FOR PP = 1 TO PI 520 PD%(PP) = PK%(PP, 2) 530 NEXT: PRINT 540 PRINT "------- cyclic space dimensions -------------------": PRINT 550 FOR i = 1 TO PI: PRINT PD%(i); : NEXT 560 PZ = 1 + ((2 ^ PD%(PI) - 1) / PI): PRINT : PRINT 570 PRINT " (you will have at least"; INT(PZ); "orbits) Continue"; 580 RETURN 590 PRINT : PRINT "computing powers" 600 FOR j = 1 TO n 610 FOR i = j TO n 620 FOR K = 1 TO n: XA% = 1 + (XA% = AA%(i, K) * X%(K, j)): NEXT 630 Z%(i, j) = XA%: Z%(j, i) = XA%: XA% = 0 640 NEXT 650 NEXT 660 FOR i = 1 TO n: FOR j = i TO n: AA%(i, j) = Z%(i, j): AA%(j, i) = Z%(i, j): NEXT: NEXT 670 CO = CO + 1: PRINT : PRINT CO; "th power": PRINT 680 IF IP = 1 THEN PK%(CO, 1) = OP: GOTO 700 690 GOSUB 840: GOSUB 910: PK%(CO, 1) = n - r 700 GOSUB 840: GOSUB 820: GOSUB 910: PK%(CO, 2) = n - r 710 U$ = "z": GOSUB 740 720 IF U$ = "z" THEN 600 730 RETURN 740 IF IP = 1 THEN 760 750 IF PK%(CO - 1, 1) = PK%(CO, 1) THEN IP = 1: OP = PK%(CO, 1): T$ = "cyclic": SOUND 345, .2: NI = CO - 1: ELSE 810 760 IF PK%(CO, 2) <> PK%(NI, 2) OR PK%(NI, 1) + PK%(CO - NI, 2) <> n THEN 810 770 CLS : PRINT "================================================": PRINT : U$ = "a" 780 SOUND 600, .2 790 PI = CO - NI 800 PRINT "period index ="; PI: PRINT "null index ="; NI: PRINT 810 RETURN 820 FOR i = 1 TO n: a%(i, i) = 1 - a%(i, i): NEXT 830 RETURN 840 'PRINT 850 PRINT : PRINT : FOR i = 1 TO n 860 FOR j = i TO n 870 a%(i, j) = AA%(i, j): a%(j, i) = a%(i, j) 880 NEXT 890 NEXT 900 RETURN 910 PRINT : PRINT "calculating "; T$; " space": PRINT : C = 0: r = 0 920 FOR j = 1 TO n 930 AA = 0 940 FOR i = 1 + C TO n 950 IF a%(i, j) = 0 THEN 1020 960 IF AA = 1 THEN 990 970 K = i: AA = 1: C = C + 1 980 GOTO 1020 990 FOR U = 1 TO n 1000 a%(i, U) = 1 + (a%(i, U) = a%(K, U)) 1010 NEXT U 1020 NEXT i 1030 G%(j) = AA 1040 IF AA = 1 AND K <> C THEN FOR U = 1 TO n: Y% = a%(K, U): a%(K, U) = a%(C, U): a%(C, U) = Y%: NEXT 1050 NEXT j 1060 FOR i = 1 TO n: r = r + G%(i): NEXT 1070 PRINT "rank="; r: PRINT 1080 RETURN 1090 PRINT : PRINT "========== tree and loop structure ================": PRINT 1100 KD%(NI + 1) = KD%(NI): q$ = " " 1110 FOR i = 1 TO NI: IF i < NI THEN D$ = " + ": ELSE D$ = "" 1120 Z = 2 * KD%(i) - KD%(i + 1) - KD%(i - 1) 1130 IF Z = 0 THEN 1160 1140 IF Z = 1 THEN C$ = "": ELSE C$ = STR$(Z) 1150 q$ = q$ + C$ + "I" + "(" + STR$(i) + ")" + D$ 1160 NEXT 1170 PRINT "TREES = "; q$':PRINT 1180 RETURN 1190 PRINT : DIM BB%(PI + 1, PI + 1), FD(PI) 1200 FOR i = 1 TO PI: FD(i) = 2 ^ PD%(i): NEXT 1210 FOR i = 1 TO PI 1220 FOR j = 1 TO PI 1230 BB%(i, j) = -(i = j * INT(i / j)) 1240 NEXT 1250 NEXT 1260 FOR j = 1 TO PI 1270 FOR i = j + 1 TO PI 1280 IF BB%(i, j) <> 1 THEN 1300 1290 FD(i) = FD(i) - FD(j) 1300 NEXT i 1310 NEXT j 1320 q$ = "" 1330 FOR i = 1 TO PI 1332 IF i < PI THEN D$ = " + ": ELSE D$ = "" 1340 Z = FD(i) / i 1350 IF Z = 0 THEN 1380 1360 IF Z = 1 THEN C$ = "": ELSE C$ = STR$(Z) 1370 q$ = q$ + C$ + "L" + "(" + STR$(i) + ")" + D$ 1380 NEXT 1390 PRINT "LOOPS = "; q$ 1392 PRINT : PRINT "======================================================" 1400 PRINT : INPUT "Do you want see again the matrix (Y or N) "; h$ 1402 IF h$ = "y" THEN GOSUB 1410: INPUT nic 1403 CLS 1405 PRINT : PRINT " ==========================================" 1406 PRINT : PRINT " Input ENTER to start over" 1415 PRINT : PRINT " or q to quit" 1408 PRINT : PRINT : INPUT " "; nic$ 1409 IF nic$ = "q" THEN END: ELSE GOTO 10 1410 CLS : PRINT : PRINT : 1411 PRINT "edges:": PRINT 1412 FOR i = 1 TO n 1414 IF i = 20 THEN INPUT "Enter to see remainder "; nic 1416 PRINT i; ":"; 1420 FOR j = i + 1 TO n 1422 IF X%(i, j) = 1 THEN PRINT j; 1430 NEXT 1440 PRINT 1450 NEXT 1460 PRINT : IF HH = 1 THEN HH = 0 ': GOTO 150 1461 PRINT 1470 RETURN 2000 CLS 2002 PRINT "==========================================================" 2010 PRINT " HARMONIC GAME ANALYSIS" 2030 PRINT 2052 PRINT 2060 PRINT "Harmonic Game is a process on a graph similar to that of cellular automata." 2070 PRINT "The differences are:" 2072 PRINT 2080 PRINT " 1. Any graph, not necessarily a rectangular grid." 2090 PRINT " 2. The evolution laws are natural and are derived from" 2092 PRINT " topological concepts.; "; "" 2110 PRINT "" 2120 PRINT "DESCRIPTION:" 2122 PRINT 2130 PRINT "Graph possesses a natural harmonic operation that is a composition of" 2140 PRINT "the boundary and coboundary operators. A consecutive application of" 2150 PRINT "harmonic operator defines an evolution of any subset of vertices" 2160 PRINT "(organism). The resulting rules of the game are:" 2170 PRINT 2180 PRINT " 1. If a vertex is excited - it dies if it has an even number of adjacent" 2190 PRINT " empty (not excited) vertices ("; breath; ");" 2200 PRINT " 2. If a vertex is not excited - it becomes excited only if it is surrounded" 2210 PRINT " by an odd number of excited vertices." 2222 INPUT nic$: IF nic$ = "q" THEN GOTO 10 2224 CLS : PRINT 2226 PRINT "INTERPRETATION" 2228 PRINT 2230 PRINT "In a sense, harmonic game is a simple, pre-geometric, model of reality," 2231 PRINT "or a physical theory. It may also serve as a simplified model of brain" 2234 PRINT "with cyclic evolutions modeling memory." 2240 PRINT : PRINT 2250 PRINT "EVOLUTION" 2252 PRINT 2260 PRINT "The states on a graph G form a directed graph G* of evolutions on this graph." 2270 PRINT "The evolution digraph G* consists of a number of loops L, and every vertex" 2280 PRINT "of L is a base of a descended tree T, which turns out to be a product" 2290 PRINT "of binary trees." 2310 PRINT : PRINT 2320 PRINT "NOTATION:" 2330 PRINT 2340 PRINT "L(n) denotes a loop of n vertices" 2350 PRINT "I(n) denotes a binary tree of height n" 2352 PRINT 2360 INPUT nic$: IF nic$ = "q" THEN GOTO 10 2362 CLS : PRINT : PRINT 2370 PRINT "EXAMPLE" 2380 PRINT "" 2390 PRINT "The evolution digraph G* may have the loop part L = 2L(1) + L(3)" 2392 PRINT "[2 loops of length 1, and 1 loop of length 3]" 2400 ' PRINT "" 2410 ' PRINT " o--o--o" 2420 ' PRINT "" 2430 ' PRINT "consists of L = 2*L(3) [2 loops of length 1 and 1 of length 3]" 2450 PRINT "" 2460 PRINT " o" 2470 PRINT " / \ o o" 2480 PRINT " o ----- o" 2490 PRINT "" 2510 PRINT "and the tree part T = I(2)*I(1) which looks like" 2520 PRINT "" 2530 PRINT " o o o o" 2540 PRINT " \ \ / /" 2546 PRINT " o" 2550 PRINT " |" 2560 PRINT " o o o" 2570 PRINT " \|/" 2580 PRINT " o" 2582 PRINT "" 2584 PRINT "[product of two binary trees: of height 1 and height 2]" 2586 PRINT : PRINT 2590 INPUT nic$: IF nic$ = "q" THEN GOTO 10 2592 CLS : PRINT : 2594 PRINT "REMARKS " 2596 PRINT 2600 PRINT "The tree part T is -- for simplicity -- reported by the program" 2610 PRINT "in an additive notation. For instance," 2620 PRINT "T = I(2)^2 * I(3) is reported as T = 2 I(2) + I(3)" 2630 PRINT : PRINT 2640 PRINT "The number of orbits may be estimated from Burnside's Lemma" 2642 PRINT "and is displayed before the structure of the evolution digraph is calculated." 2648 PRINT : PRINT : PRINT 2650 PRINT "-------------------------------------------------------" 2660 PRINT "The theory of harmonic evolutions is introduced in:" 2662 PRINT 2670 PRINT "[K] J. Kocik: Harmonic invariants of graphs, Prep. of Math Dept, SIU, 1990" 2680 PRINT 2690 PRINT "This program is written by Philip Feinsilver" 2700 PRINT "(with minor editorial changes by Jerzy Kocik)" 2720 PRINT : PRINT : PRINT 2740 INPUT "Return to the program (enter)"; nic$ 2750 GOTO 10 3000 PRINT : PRINT : PRINT 3040 PRINT "This program is written by Philip Feinsilver and Jerzy Kocik)" 3060 PRINT 3070 PRINT "The theory of harmonic evolutions and the algorithm is introduced in:" 3080 PRINT 3090 PRINT "J. Kocik: Harmonic invariants of graphs, Prep. of Math Dept, SIU" 3091 PRINT "J. Kocik: Harmonic operator, harmonic evolution, and new graph invariants ofHarmonic invariants, Prep. of Dept of Phys, UIUC" 3092 PRINT "Contact: jkocik@physics.uiuc.edu" 3100 INPUT "Return to the program (enter)"; nic$ 3110 GOTO 10