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

2.4 轨道规模的度量

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

template<typename F> requires(Transformation(F))
triple<DistanceType(F), DistanceType(F), Domain(F)>
orbit structure nonterminating orbit(const Domain(F)& x, F f)
{ typedef DistanceType(F) N; Domain(F) y = connection point nonterminating orbit(x, f); return triple<N, N, Domain(F)>(distance(x, y, f), distance(f(y), y, f), y);
}
template<typename F, typename P> requires(Transformation(F) &&
UnaryPredicate(P) && Domain(F) == Domain(P)) triple<DistanceType(F), DistanceType(F), Domain(F)> orbit structure(const Domain(F)& x, F f, P p)
{
//前条件:p(x). f(x)有定义
typedef DistanceType(F) N;Domain(F) y = connection point(x, f, p);N m = distance(x, y, f);N n(0);if (p(y)) n = distance(f(y), y, f);
//终止时:m=h.1∧n=0//否则:m=h∧n=c.1
return triple<N, N, Domain(F)>(m, n, y);
}

练习2.4请推导出本章各算法中使用不同操作(f,p,相等)的次数的公式.
练习2.5用orbitstructurenonterminatingorbit确定在你所使用的平台上的伪随机数生成器对不同种子值的平均柄规模和环路规模.

时间: 2024-09-12 23:23:18

《编程原本 》一2.4 轨道规模的度量的相关文章

《编程原本 》一导读

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

《编程原本 》一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章 变换及其轨道

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

《编程原本 》一2.6 总结

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

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

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

《编程原本 》一2.1 变换

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

《编程原本 》一1.3 对象

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

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

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

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

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