#@5772156的[飞速增长函数](http://tieba.baidu.com/photo/p?kw=%E4%B8%89%E4%BD%93&flux=1&tid=1974397148&pic_id=7eb45582b2b7d0a2e1519466cbef76094a369a36&pn=1&fp=2&see_lz=1)
##定义
`int`没有上下限.
###分隔符变量
```cpp
typedef int separator;
_tokenof("int n","separator p",";\[$n\]","$p=$n");
```
例:`;[3]`是一个3级分隔符.
####数学写法
$I_n=$`;[n]`;
###串变量
```cpp
struct str;
struct strptr{
str* ptr;
separator sep;
};
struct str{
strptr* nxt;
int t;
};
_tokenof("separator n,str nxt","strptr nu","$n$nxt","$nu.sep=$n,$nu.ptr=*$nxt");
_tokenof("int n,strptr q","str p","{$n$0[$q]}","$p.t=$n,$0[$p.nxt=*$q].[$p.nxt=NULL]");
```
在这里解释一下`_tokenof`...其实是一个模式匹配的东西.这个模式匹配是比较简陋的(虽然是虚拟的,仅仅为了解释本文中心函数存在).
_tokenof(TEMP_VARS,LITERAL,PATTERN,GENERATING_RULE)
TEMP_VARS和LITERAL都没有什么特殊的用法,LITERAL表示创造出来的字面量.
PATTERN的语法是
str = {[regular string]}
identifier = C identifier
varx = {[int]}[pattern]|{[identifier]}
var = ${[varx]}
pattern = {[str]}{[var]}[,{[var]}][{[str]}|{[pattern]}]
{[xx]}
表示此部分调用xx
的语法分析.[xx]
表示xx可省略a | b
可添小括号或按照最外层括号处理,表示a或bc
表示转义c,使它没有用\\\
表示\
\c
表示c
- 从左到右处理
文法满足LL(1).
GENERATING_RULE语法是扩展的C++语法.
插值基本和PATTERN部分一样,多了条件插值${x=[int]}[{[patt1]}].[{[patt2]}]
表示若存在解析$x[]
(即解析到了这个里面返回了值)执行patt1
否则patt2
.
解释定义= =|||
就是str类似以下的东西...
{1}
{1;[0]1}
{1;[0]1;[3]9}
其中;[n]
是n级分隔符= =|||
串变量限定
- (mathtt{str}k) 表示一个串变量
str$k
- (mathtt{str}k_i) 包含分隔符等级最多为(i)的串变量
- (mathtt{str}k_i^n) (上一句),且用n填充数字
串的拼接
(aI_nb)表示a与b拼接中间插上了一个为(I_n)的分隔符.
函数(A(str))定义
Predefinition
(,=I_0)
(;=I_1)
(a,b,nin N_+,m,i,j,kin N) [match all]
注意以下函数内逗号作为0级分隔符用,切记切记.
Definition
[A(mathtt{str}0I_ia,b)=A(mathtt{str}0I_ia-1,A(mathtt{str}0I_ia,b-1))~~~mathtt{(1)}
]
[A(mathtt{str}0I_iaI_jmathtt{str}1^0I_k0)=A(mathtt{str}0I_i(a-1)I_jmathtt{str}1^0I_k1)~~~mathtt{(2)}
]
[A(mathtt{str}0I_ia,0I_jmathtt{str}1^0I_kb)=A(mathtt{str}0I_i(a-1),A(mathtt{str}0I_ia,0I_jmathtt{str}1^0I_k(b-1))I_jmathtt{str}1^0I_k0)~~~mathtt{(3)}
]
[A(mathtt{str}0I_iaI_n0I_jmathtt{str}1^0I_kb)=A(mathtt{str}0I_i(a-1)I_n3I_{n-1}underbrace{0I_{n-1}0I_{n-1}0I_{n-1}dots 0}\_{b-1个0}I_jmathtt{str}1^0I_k0)~~~mathtt{(4)}
]
[A(mathtt{str}0^0I_imathtt{str}1)=A(mathtt{str}1)~~~mathtt{(5)}
]
[A(mathtt{str}0I_iaI_nb)=A(mathtt{str}0I_i(a-1)I\_n3I_{n-1}underbrace{0I_{n-1}0I_{n-1}dots 0}_{b-1个0})~~~mathtt{(6)}
]
IF((n)>(m)) exist rules
[A(mathtt{str}0I_nmathtt{str}1^0_{n-1}I_mmathtt{str}2_{n-1})=A(mathtt{str}0I_nmathtt{str}2_{n-1})~~~mathtt{(7)}
]
[A(mathtt{str}0\_iI_nmathtt{str}1^0_{n-1}I_mmathtt{str}2_{n-1}I_nmathtt{str}3_j)=A(mathtt{str}0_iI_nmathtt{str}2_{n-1}I_nmathtt{str}3_j)~~~mathtt{(8)}
]
Ackermann like rule
[A(m)=m+1~~~mathtt{(9)}
]
函数(D(n))定义
[D(n)=A(3I_n0)~~~mathtt{(10)}
]
简单分析
其实是我水平不够,没法复杂分析.
我们先把迭代式子分类:
- A:缩串类 就是把一段全是0的str缩掉 (5) (7) (8)
- B:迭代增长类 就是朴素的迭代增长,通过类似Ackermann的方法增长 (1) (2) (3)
- C:缩级别增长 可以看出str内的数字对str影响不大,此时我们通过 (4) (6) 运行时增加str规模
- D:杂项 (9)保证了规模的增大 (10)是输入
额...这个函数过于复杂超出了我理解的范围了..= =||
其实可以看成高维度的Ackermann函数...每次降维都会导致数据规模飞速增长,包括维度的数的一部分,对于维度的迭代也是非原始递归的增长...所以这个速度...我想静静...= =||
这个函数是可计算的,正确性可以脑补...因为分隔符级别只降不升,而大杀器A类规则
可以将一些迭代到0的部分减小规模.
燃烧掉已经虚无的斗志,脚踏实地的迈下每一步
Chapter2 求和
重要技术
- 待定系数法(repertoire method) 基本思路就是放宽递归式中阻碍运算的限制,然后用特殊值求出一般规律
- 求和因子法 即将递归关系是类似G(n)=C(n)G(n-1)+F(n)(F,C与G无关)的递归式转化为求和式的方法
- 扰动法 通过对函数带入值的扰动找到一个与函数相关的可以解出函数表达式的方法
- 求和指标变换
- 展开与收缩
- 有限微积分
重要概念
- 阶乘幂
- 差分
- 不定和式
重要理论
- 朴素的无穷和式与它的收敛性