Advertisement
Guest User

Untitled

a guest
Aug 25th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. \documentclass{article}
  2. %\url{http://tex.stackexchange.com/q/129613/86}
  3. \usepackage[landscape]{geometry}
  4. \usepackage{tikz}
  5. \usepackage{expl3}
  6. \usepackage{xparse}
  7.  
  8. \ExplSyntaxOn
  9.  
  10. \int_new:N \l__binp_int
  11. \int_set:Nn \l__binp_int {4}
  12. \tl_new:N \l__bina_tl
  13. \tl_new:N \l__binb_tl
  14. \tl_new:N \l__binhw_tl
  15. \int_new:N \l__bina_int
  16. \int_new:N \l__binb_int
  17. \int_new:N \l__binc_int
  18. \int_new:N \l__bind_int
  19. \fp_new:N \l__bina_fp
  20.  
  21. \DeclareDocumentCommand \BinaryPrecision {m}
  22. {
  23. \int_set:Nn \l__binp_int {#1}
  24. }
  25.  
  26. \cs_new_nopar:Npn \int_to_bin:Nn #1#2
  27. {
  28. \tl_clear:N #1
  29. \int_set:Nn \l__bina_int {#2}
  30. \prg_replicate:nn {\l__binp_int}
  31. {
  32. \int_set:Nn \l__binb_int {\int_mod:nn {\l__bina_int} {2}}
  33. \tl_put_left:Nx #1 {\int_use:N \l__binb_int}
  34. \int_set:Nn \l__bina_int {\int_div_truncate:nn {\l__bina_int} {2}}
  35. }
  36. }
  37.  
  38. \cs_new_nopar:Npn \bin_hamming_weight:NN #1#2
  39. {
  40. \tl_set_eq:NN \l__binhw_tl #2
  41. \tl_replace_all:Nnn \l__binhw_tl {0} {}
  42. \int_set:Nn #1 {\tl_count:N \l__binhw_tl}
  43. }
  44.  
  45. \cs_new_nopar:Npn \bin_flip_one:NNn #1#2#3
  46. {
  47. \tl_set_eq:NN #2#1
  48. \prg_replicate:nn {#3 - 1}
  49. {
  50. \tl_replace_once:Nnn #2 {1} {a}
  51. }
  52. \tl_replace_once:Nnn #2 {1} {0}
  53. \tl_replace_all:Nnn #2 {a} {1}
  54. }
  55.  
  56. \DeclareDocumentCommand \HammingWeight {m m}
  57. {
  58. \int_to_bin:Nn \l__binhw_tl {#2}
  59. \bin_hamming_weight:NN #1 \l__binhw_tl
  60. }
  61.  
  62. \DeclareDocumentCommand \HyperCube {m}
  63. {
  64. \int_set:Nn \l__binp_int {#1}
  65. \int_zero_new:c {l__hyper_0_int}
  66. \int_set:cn {l__hyper_0_int} {-1}
  67. \int_step_inline:nnnn {1} {1} {#1}
  68. {
  69. \int_zero_new:c {l__hyper_##1_int}
  70. \int_set:cn {l__hyper_##1_int} {\int_use:c {l__hyper_\int_eval:n {##1 - 1}_int} * (#1 - ##1 + 1) / ##1}
  71. }
  72. \fp_set:Nn \l__bina_fp {2^{#1}-1}
  73. \int_set:Nn \l__binc_int {\fp_to_int:N \l__bina_fp}
  74. \int_step_inline:nnnn {0} {1} {\l__binc_int}
  75. {
  76. \int_to_bin:Nn \l__bina_tl {##1}
  77. \bin_hamming_weight:NN \l__binb_int \l__bina_tl
  78. \node[every~ hypercube~ label/.try] (hg- \l__bina_tl) at (\int_use:c {l__hyper_\int_use:N \l__binb_int _int},\int_use:N \l__binb_int) {##1};
  79. \int_incr:c {l__hyper_\int_use:N \l__binb_int _int}
  80. \int_incr:c {l__hyper_\int_use:N \l__binb_int _int}
  81. }
  82. \int_step_inline:nnnn {0} {1} {\l__binc_int}
  83. {
  84. \int_to_bin:Nn \l__bina_tl {##1}
  85. \bin_hamming_weight:NN \l__binb_int \l__bina_tl
  86. \int_step_inline:nnnn {1} {1} {\l__binb_int}
  87. {
  88. \bin_flip_one:NNn \l__bina_tl \l__binb_tl {####1}
  89. \draw[every~ hypercube~ edge/.try] (hg- \l__bina_tl) -- (hg- \l__binb_tl);
  90. }
  91. }
  92. }
  93.  
  94. \ExplSyntaxOff
  95.  
  96.  
  97. \begin{document}
  98. \begin{tikzpicture}
  99. \HyperCube{7}
  100. \end{tikzpicture}
  101.  
  102. \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement