{"id":855,"date":"2025-06-11T11:52:45","date_gmt":"2025-06-11T02:52:45","guid":{"rendered":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/?page_id=855"},"modified":"2025-06-11T11:52:45","modified_gmt":"2025-06-11T02:52:45","slug":"source-code","status":"publish","type":"page","link":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/?page_id=855","title":{"rendered":"Source code"},"content":{"rendered":"\n<p>Program to show that no perfect 1-factorization for K_{4,4,4}<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def cond_perm(X, cond):\n  L = &#91;&#91;]]\n  for c in cond:\n    L_tmp = L\n    L = &#91;]\n    for l in L_tmp:\n      for x in set(X)-set(c)-set(l):\n        L.append(l+&#91;x])\n  return L\n\ndef one_factor(L3AD, i):\n  n = len(L3AD&#91;0])\n  x_axis = &#91;'x'+str(k) for k in range(1,n+1)]\n  y_axis = &#91;'y'+str(k) for k in range(1,n+1)]\n  z_axis = &#91;'z'+str(k) for k in range(1,n+1)]\n  one_f = {}\n  for r in range(n):\n    c = (L3AD&#91;1]&#91;r]+&#91;i]).index(i)\n    if c &lt; n:\n      x, y = x_axis&#91;-c-1], y_axis&#91;-r-1]\n      one_f&#91;x], one_f&#91;y] = y, x\n    z, xy = z_axis&#91;r], (x_axis&#91;::-1]+y_axis)&#91;L3AD&#91;0]&#91;r].index(i)]\n    one_f&#91;z], one_f&#91;xy] = xy, z\n  return one_f\n\ndef cycle(L3AD, i1, i2, vertex):\n  one_factor_1 = one_factor(L3AD, i1)\n  one_factor_2 = one_factor(L3AD, i2)\n  cyc = &#91;]\n  while vertex not in cyc:\n    cyc.append(vertex)\n    vertex = one_factor_1&#91;vertex]\n    cyc.append(vertex)\n    vertex = one_factor_2&#91;vertex]\n  return cyc\n\ndef check_P1F(L3AD):\n  n = len(L3AD&#91;0])\n  for i in range(1,2*n+1):\n    for j in range(i+1,2*n+1):\n      if len(cycle(L3AD, i, j, 'x1')) &lt; 3*n:\n        return False\n  return True\n\n\n\nY = list(range(1,9))\n\nfor t_row1 in cond_perm(set(Y)-{8},zip(Y&#91;:4])):\n  c1 = list(zip(Y&#91;:4],t_row1))\n  for t_row2 in cond_perm(set(Y)-{7},c1):\n    c2 = list(zip(Y&#91;:4],t_row1,t_row2))\n    Y2_ = {i for i in Y if (t_row1+t_row2).count(i)>=2}\n    for t_row3 in cond_perm(set(Y)-{6}-Y2_,c2):\n      c3 = list(zip(Y&#91;:4],t_row1,t_row2,t_row3))\n      Y3_ = {i for i in Y if (t_row1+t_row2+t_row3).count(i)>=2}\n      for t_row4 in cond_perm(set(Y)-{5}-Y3_,c3):\n        c4_1 = list(zip(Y&#91;:4],t_row1,t_row2,t_row3,t_row4))\n        c4_2 = &#91;&#91;5]+t_row4,\n                &#91;6]+t_row3,\n                &#91;7]+t_row2,\n                &#91;8]+t_row1]\n      \n        for s_row2 in cond_perm(set(Y),c4_1+c4_2):\n          c5_1 = list(zip(Y&#91;:4],t_row1,t_row2,t_row3,t_row4,s_row2&#91;:4]))\n          c5_2 = &#91;&#91;5]+t_row4+&#91;s_row2&#91;4]],\n                  &#91;6]+t_row3+&#91;s_row2&#91;5]],\n                  &#91;7]+t_row2+&#91;s_row2&#91;6]],\n                  &#91;8]+t_row1+&#91;s_row2&#91;7]]]\n          for s_row3 in cond_perm(set(Y),c5_1+c5_2):\n            c6_1 = list(zip(Y&#91;:4],t_row1,t_row2,t_row3,t_row4,s_row2&#91;:4],s_row3&#91;:4]))\n            c6_2 = &#91;&#91;5]+t_row4+&#91;s_row2&#91;4]]+&#91;s_row3&#91;4]],\n                    &#91;6]+t_row3+&#91;s_row2&#91;5]]+&#91;s_row3&#91;5]],\n                    &#91;7]+t_row2+&#91;s_row2&#91;6]]+&#91;s_row3&#91;6]],\n                    &#91;8]+t_row1+&#91;s_row2&#91;7]]+&#91;s_row3&#91;7]]]\n            for s_row4 in cond_perm(set(Y),c6_1+c6_2):\n              L3AD = &#91;&#91;Y,s_row2,s_row3,s_row4],\n                     &#91;t_row1,t_row2,t_row3,t_row4]]\n              \n              print(*L3AD&#91;0],*L3AD&#91;1], sep=\"\u00a5n\")\n\n              if(check_P1F(L3AD)):\n                print('perfect')\n                exit()\n              else:\n                print('non-perfect')\n              \n\n\n\n<\/code><\/pre>\n\n\n\n<p>Program to count the number of Latin regular hexahedra of order 2<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>N = 2\nX = list(range(1,4*N+1))\n\n\ndef cond_perm(X, cond):\n  L = &#91;&#91;]]\n  for c in cond:\n    L_tmp = L\n    L = &#91;]\n    for l in L_tmp:\n      for x in set(X)-set(c)-set(l):\n        L.append(l+&#91;x])\n  return L\n  \ndef contra(circuit):\n  c = &#91;]\n  for i in &#91;2,3,0,1]:\n    c += circuit&#91;(i+1)*N-1:i*N-1 if i>0 else None:-1]\n  return c\n\ndef top_bottom(side):\n  tb_list = &#91;&#91;]]\n  cond = list(map(list,zip(*side,*map(contra,side))))\n  c = cond&#91;N:2*N]*2\n  for i in range(N):\n    tb_list_tmp = tb_list\n    tb_list = &#91;]\n    for tb in tb_list_tmp:\n      if tb_list_tmp != &#91;&#91;]]:\n        add_c = list(map(list,zip(*tb)))\n        c = &#91;c&#91;j]+add_c&#91;j]+add_c&#91;j+N] for j in range(N)]*2\n      for row in cond_perm(set(X)-set(cond&#91;i]),c):\n        tb_list.append(tb+&#91;row])\n  return tb_list\n\ndef formalize_top_bottom(tb):\n  return &#91;&#91;tb&#91;i]&#91;:N] for i in range(N)], &#91;tb&#91;i]&#91;N:] for i in reversed(range(N))]]\n\ndef L_list(n, X):\n  side_list = &#91;&#91;X]]\n  for _ in range(n-1):\n    side_list_tmp = side_list\n    side_list = &#91;]\n    for s in side_list_tmp:\n      for circ in cond_perm(X,zip(*s,*map(contra,s))):\n        side_list.append(s+&#91;circ])\n  \n  L_list, L_list_upto_tb_trans = &#91;], &#91;]\n  for side in side_list:\n    tb_list = top_bottom(side)\n    L_list += &#91;side+&#91;tb] for tb in tb_list]\n    if len(tb_list)>0:\n      L_list_upto_tb_trans += &#91;side+&#91;tb_list&#91;0]]]\n  \n  L_list_upto_trans = &#91;]\n  for L in L_list_upto_tb_trans:\n    flag = False\n    a = list(map(set,zip(L&#91;1]&#91;:4],contra(L&#91;1])&#91;:4])))\n    for i in range(len(L_list_upto_trans)):\n      if a == list(map(set,zip(L_list_upto_tb_trans&#91;i]&#91;1]&#91;:4],contra(L_list_upto_tb_trans&#91;i]&#91;1])&#91;:4]))):\n        flag = True\n        break\n    if flag is False:\n      L_list_upto_trans.append(L)\n  \n  return L_list, L_list_upto_tb_trans, L_list_upto_trans\n\ndef display(L):\n  print('  '*N+'+'+'-'*(2*N-1)+'+')\n  for t in formalize_top_bottom(L&#91;2])&#91;0]:\n    print('  '*N+'|'+' '.join(map(str, t))+'|')\n  print(('+'+'-'*(2*N-1))*4+'+')\n  for i in range(N):\n    print('|'+(('{} '*(N-1)+'{}|')*4).format(*L&#91;i]))\n  print(('+'+'-'*(2*N-1))*4+'+')\n  for b in formalize_top_bottom(L&#91;2])&#91;1]:\n    print('  '*N+'|'+' '.join(map(str, b))+'|')\n  print('  '*N+'+'+'-'*(2*N-1)+'+')\n\n\n\nL_set, _, L_f = L_list(N, X)\n\nprint(len(L_f))\nfor L in L_f:\n  display(L)\n\nprint(len(L_set)*8*7*6*5*4*3*2)\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Program to show that no perfect 1-factorization for K_{4,4,4} Program to count the number of Latin regular hex [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-855","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=\/wp\/v2\/pages\/855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=855"}],"version-history":[{"count":1,"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=\/wp\/v2\/pages\/855\/revisions"}],"predecessor-version":[{"id":856,"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=\/wp\/v2\/pages\/855\/revisions\/856"}],"wp:attachment":[{"href":"http:\/\/www.math.akita-u.ac.jp\/yamamura\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}