《编程原本 》一2.2 轨道

2.2 轨道

要理解一个变换的全局行为,可以考察其轨道(orbit)的结构.所谓变换的轨道,就是从一个开始元素出发,通过反复应用这一变换能到达的所有元素.如果对某个n.0有y=fn(x),就说y是从x出发在变换f下可达的(reachable).如果有某个n.1使x=fn(x),就说x在f下是环路的(cyclic).如果x不在f的定义空间里,称x在f下是终止点(terminal).x在变换f下的轨道(orbit)就是x

在f 下可达的所有元素的集合.
引理2.2 一条轨道不会同时包含环路元素和终止元素.
引理2.3 一条轨道至多包含一个终止元素.
如果元素y为从x在f下可达,从x到y的距离(distance)定义为从x得到y的最小的变换步数.显然,距离并不总有定义.
给定变换类型F,类型DistanceType(F)是一个足够大的整数类型,足以表示任何变换f∈ F从T=Domain(F)的一个元素到另一元素的最大变换步数.如果类型T用k个二进制位表示,它就有2k 个值,而不同值之间只有2k.1个变换步.这样,如果T是固定大小的类型,同样大小的整数类型就能作为表示T上任意变换的距离的合法类型.(可以不用距离类型,而是在powerunary里用任意整数类型,因为这种额外推广不会在这里造成问题.)一种常见情况是同一定义域上的变换都具有同样的距离类型.这时类型函数DistanceType就对这一定义域类型有定义,定义了与相关变换类型对应的类型函数.
如果类型函数DistanceType存在,就可以写出下面过程:
template
requires(Transformation(F)) DistanceType(F) distance(Domain(F) x, Domain(F) y, F f) {
//前条件:y在f下从x可达
typedef DistanceType(F) N;
N n(0);
while (x != y) {
x = f(x);
n = n + N(1);
}
return n;
}
轨道有不同的形状.x在某变换下的轨道可以是

无穷的 若它既不是终止的也没有环路
终止的 若它有一个终止元素
环路的 若x 是环路的
ρ 形的 若x本身不是环路的,但它的轨道包含环路元素

如果x的轨道不是无穷的,它就是有穷的.图2.1给出了轨道的各种情况.
轨道环(cycleoforbit)是轨道的一集元素,规定轨道为无穷或终止时其环为空.轨道柄(handleoforbit)是轨道里除去环之外的部分,环路轨道的柄为空.连接点(connectionpointoforbit)是轨道上的第一个环路元素,对环路轨道取其第一个元素,对ρ形轨道是轨道柄之后的第一个元素.轨道规模(sizeoforbit)o是轨道中不同元素的个数;轨道的柄规模(handlesize)h是轨道柄中元素的个数;环规模(circlesize)c是轨道环中元素的个数.
引理2.4 o = h + c
引理2.5 从轨道中任意一点到该轨道的环路中任意一点的距离都有定义.
引理2.6若x和y是规模为c的环里的两个不同点,那么
c=distance(x,y,f)+distance(y,x,f)
引理2.7若x和y是规模为c的环的两个不同点,x到y的距离满足
0.distance(x,y,f)

时间: 2024-10-23 16:28:02

《编程原本 》一2.2 轨道的相关文章

《编程原本 》一第2章 变换及其轨道

第2章 变换及其轨道 本章把变换定义为从一个类型到它自身的规范函数.从一个初始值开始连续应用一个变换,就得到了这个值的轨道.我们要实现一个能确定轨道结构的算法,它只依赖于变换的规范性和轨道的有穷性.这个算法可以应用到不同的领域.例如,可以用它检查一个链接表是否为循环的,或用于分析一个伪随机数生成器.我们将为这一算法推导出一套接口,形式上是一集过程及其参数和结果的定义.对轨道结构算法的分析,使我们可以用最简单的方式介绍自己的编程方法.

《编程原本 》一2.4 轨道规模的度量

2.4 轨道规模的度量 对于类型T上的轨道,有关规模o,h和c的自然类型应该是一个足以记录类型T中所有不同的值的个数的整数计数类型.如果类型T占了k位,它至多有2k 个值,所以一个k位的计数类型将不能表示从0到2k 的所有计数值.但在使用距离类型时有一种表示这些规模的方法.一条轨道有可能包含某类型的所有值,这时o就可能无法存入相应的距离类型.对不同形状的轨道,h或c也可能无法存入.然而对ρ-形轨道,h和c一定能存入.对所有情况下面几个量都可以存入:o.1(轨道中的最大距离),h.1(柄里的最大距

《编程原本 》一3.1 可结合性

3.1 可结合性 二元运算是有两个参数的运算: 二元的加法和乘法是数学的核心概念,常用的这类东西很多,如求较小或较大的值,合取和析取,集合的交与并等.这些运算都是可结合的(associative): 当然,也存在不可结合的二元运算,例如除法和减法. 如果根据上下文完全可以看清所用的可结合二元运算op,我们常用隐式的乘法记法将其写成ab而不是op(a,b).由于可结合性,在涉及两次或多次应用op的表达式里不需要括号,因为所有分组方式都等价:((a0a1))an.1= •••••• =a0((an.

《编程原本 》一2.6 总结

2.6 总结 抽象使我们可以定义出一些能用于不同领域的抽象过程.规范性和函数的类型在这里起着最重要的作用:fast和slow能走同一条轨道的基础就是规范性.开发一批专有术语(例如,轨道的类型和规模),是最基础最重要的工作.一些附属类型,例如距离类型,也需要精确地定义.

《编程原本 》一2.1 变换

2.1 变换 虽然从任意一组类型到任意类型的函数都存在,但是有些具有特殊签名的函数类更为常用.本书中经常用的是两类函数:同源谓词和同源运算.同源谓词在形式上都是Tו••× T → bool;同源运算都是形如Tו••× T → T的函数.一般而言存在着任意的n元谓词和n元运算,但实际中遇到最多的还是一元和二元的同源谓词,一元和二元的同源运算.谓词是返回真值的函数: Predicate(P).FunctionalProcedure(P)∧Codomain(P)=bool 同源谓词也是同源函数:

《编程原本 》一导读

前 言 本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系.书中把反映这些理论的规程(speci.cation),基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者.这些算法在一种实际程序设计语言里的实现是本书的中心.虽然规程主要是供人阅读,但它们也应该(或者说必须)严格地与非形式化的.供机器使用的代码相结合,必须在通用的同时又是抽象而且精确的.与在其他科学和工程领域里的情况一样,适合作为程序设计的基础的同样是演绎方法.演绎方法能帮助我们将复杂系统

《编程原本 》一1.3 对象

1.3 对象 一个存储(memory)就是一集存储字(word),其中每个字有一个地址(address)和一项内容(content).地址是一种固定大小的值,这个大小称为地址长度.而内容是另一固定大小的值,其长度称为字长.通过装载(load)操作可以取得一个地址的内容.通过保存(store)操作改变一个地址所关联的内容.存储的实例如计算机主存里的一组字节,或磁盘驱动器里的一组区块. 一个对象(object)就是一个具体实体的表示,并且是作为某个存储里一个值.对象有状态(state),其状态就是某

《编程原本 》一第3章 可结合运算

第3章 可结合运算 本章讨论可结合的二元运算.可结合性使人可以重组相邻的运算,基于这种重组能力可以得到一个计算二元运算的幂的有效算法.规范性使我们可以用许多程序变换来优化这一算法.我们随后要利用该算法在对数时间里计算各种线性递归,例如计算斐波那契数.

《编程原本 》一1.1 理念范畴: 实体, 类别, 类属

1.1 理念范畴: 实体, 类别, 类属 为了解释什么是对象.类型,以及其他基本的计算机概念,概述一下与这些概念对应的理念范畴是很有帮助的.抽象实体(abstractentity)指永存的不变的事物,而具体实体(concreteentity)指具体的个别的事物,其出现和存在与时间和空间有关.一个属性(attribute)是具体实体与抽象实体之间的一种对应关系,它描述了该具体实体的某种性质.度量或者品质.标识(identity)是我们感知实在世界的一种基本概念,它确定一个事物在随着时间变化中的不变