假设我们的首字母为,且$a_{1,0}=0$
。$a_{1,1}=1$
给定一个整数,定义$a_{1,j}=0$
$j<0$
$n$
$$a_{i,j}=\begin{cases} a_{i-1,\frac{j}{2}} & \text{ if $j$ is even},\\
a_{i-1,\frac{j-1}{2}}+a_{i-1,\frac{j+1}{2}} & \text{ if $j$ is odd}
\end{cases}$$
while$2\leq i \leq n$
和$0\leq j \leq 2^{i-1}$
。我如何编写算法 TikZ 代码来生成以下列表(例如$n=6$
):
完整代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\begin{document}
Suppose, our initials are $a_{1,0}=0$, $a_{1,1}=1$ and $a_{1,j}=0$ for $j<0$. For given an integer $n$, define
$$a_{i,j}=\begin{cases} a_{i-1,\frac{j}{2}} & \text{ if $j$ is even},\\
a_{i-1,\frac{j-1}{2}}+a_{i-1,\frac{j+1}{2}} & \text{ if $j$ is odd}
\end{cases}$$
while $2\leq i \leq n$ and $0\leq j \leq 2^{i-1}$
\end{document}
我想要以下输出:
0 1
0 1 1
0 1 1 2 1
0 1 1 2 1 3 2 3 1
0 1 1 2 1 3 2 3 1 4 3 5 2 5 3 4 1
0 1 1 2 1 3 2 3 1 4 3 5 2 5 3 4 1 5 4 7 3 8 5 7 2 7 5 8 3 7 4 5 1
答案1
这不是 TikZ 解决方案,而是 LuaLaTeX 解决方案。
% !TEX encoding = UTF-8
% !TEX program = LuaLaTeX
% !TEX spellcheck = en_GB
\documentclass{article}
\usepackage{luacode}
\usepackage{amsmath}
\usepackage{xcolor}
\begin{document}
Suppose, our initials are $a_{1,0}=0$, $a_{1,1}=1$ and $a_{1,j}=0$ for $j<0$. For given an integer $n$, define
\[
a_{i,j}=%
\begin{cases}
a_{i-1,\frac{j}{2}} & \text{ if $j$ è pari},\\
a_{i-1,\frac{j-1}{2}}+a_{i-1,\frac{j+1}{2}} & \text{ if $j$ è dispari}
\end{cases}
\]
while $2\leq i \leq n$ and $0\leq j \leq 2^{i-1}$
\noindent
\begin{luacode*}
---------------------------
-- Variables declaration --
---------------------------
local N = 6
local A = {}
--------------------
-- Initialization --
--------------------
A[1] = {}
A[1][0] = 0
A[1][1] = 1
-----------------------------------
-- Computations and tex.printing --
-----------------------------------
tex.print(A[1][0].." "..A[1][0].."\\\\")
for i=2,N do
A[i] = {}
for j=0,2^(i-1) do
if math.ceil(j/2)==math.floor(j/2) then
A[i][j] = A[i-1][j/2]
else
A[i][j] = A[i-1][(j-1)/2]+A[i-1][(j+1)/2]
end
tex.print(A[i][j])
end
tex.print("\\\\")
end
\end{luacode*}
% TO TEST
\rule{\textwidth}{1pt}
0 1 1 2 1 3 2 3 1 4 3 5 2 5 3 4 1 5 4 7 3 8 5 7 2 7 5 8 3 7 4 5 1
\end{document}
享受!
答案2
关于数学的有趣问题:)
在数论中,斯特恩-布罗科特树是一种无限完全二叉树,其中的顶点精确对应于正有理数,其值按搜索树的方式从左到右排序。(维基百科)
您的数字列表是 Brocot 树有理数的分子。
我们可以用单维列表或数组获取这些数字。可以手动构建此列表,但也存在一些有用的工具,例如 pgfplots 中的一些工具可用于处理列表和数组,但在这里我想尝试一下arrayjobx
。这是 的最新更新arrayjob
。
嗯,使用 Maple、Mathematica、Maxima 或 Lua 更容易,但为了好玩,我更喜欢 TeX。下一个代码没有优化。我使用了第一个想法……
我们需要定义列表:
我还没有读完 arrayjobx 的所有文档,但我认为第一个元素有一个索引 =1。
\documentclass[11pt]{scrartcl}
\usepackage{arrayjobx,tikz}
\begin{document}
\parindent=0pt
\newcounter{compt}\setcounter{compt}{2}% we need a counter
\newarray\brocot
\readarray{brocot}{1}% the real first number
\expandarrayelementtrue% idon't know if this macro is necessary
0\ \brocot(1)\ % I don't try \brocot(0)
\makeatletter
\loop
\ifodd\thecompt% iseven is possible with tikz iseven comes from tkz-berge
\pgfmathtruncatemacro{\tmpabrocot}{(\thecompt-1)/2}%
\checkbrocot(\tmpabrocot)%
\let\@tempa\cachedata
\pgfmathtruncatemacro{\tmpbbrocot}{(\thecompt+1)/2}%
\checkbrocot(\tmpbbrocot)%
\let\@tempb\cachedata
\pgfmathtruncatemacro{\tmpbrocot}{\@tempb+\@tempa}%
\brocot(\thecompt)={\tmpbrocot}% perhaps we can use a better code
\brocot(\thecompt)\ %
\else
\pgfmathtruncatemacro{\tmpbrocot}{\thecompt/2}%
\checkbrocot(\tmpbrocot)%
\brocot(\thecompt)={\cachedata}%
\brocot(\thecompt)\ %
\fi
\ifnum\thecompt<32 \addtocounter{compt}{1}%
\repeat
\brocot(25)
\end{document}