Re!
【 在 darkk 的大作中提到: 】
: 标 题: 论 Χ( {Pf, Se}, 2 )
: 发信站: 水木社区 (Wed Nov 23 13:13:49 2022), 站内
:
: 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
:
: 合数都可以写成几个质数相乘的形式。写成表达式,即对于任何一个合数 N ,总是存在一个一个有 M 个项目的数列, P[i] ,(1 <= i <= M),使得
:
: N = Prim(1) ^ P[1] + Prim(2) ^ P[2] + Prim(3) ^ P[3] …… Prim(M) ^ P[M] 。
:
: 其中,Prim(i) 表示第 i 大的质数。例如 Prim(1) = 2,Prim(3) = 5 。
:
: 这即是“合数分解存在定理”。例如:
:
: 2022 = 2 * 3 * 337 = Prim(1) ^ 1 * Prim(2) ^ 1 + Prim(68) ^ 1 。
:
: 即 P = {1, 1, ...65个0, 1 }
:
: 注意 P[i] 可能大于 2 。例如 36 = 2 ^ 2 * 3 ^ 2 = Prim(1) ^ 2 * Prim(2) ^ 2 。
:
: 考虑一段计算机指令,这段计算机指令主要是为了得出事物之间的关系,体现了对数据的观测、统计和综合,其如果可能则只可能读取系统状态变量,但绝不改变系统状态变量,其所有的赋值仅仅在于临时变量,而不会让系统带来其他任何意义上的变更(modification)。这样子的计算机
: 噶钇危颐浅莆且桓龃亢≒ure Function),下面记为 Pf 。
:
: 例如下面这个函数编译成计算机指令之后即可认为属于 Pf :
:
: int LinearCompose(double x, double a, double b){
: return a * x + b;
: }
:
: void main(void){
: printf("Result of applying a Pf : %d \n", LinearCompose(3, 2, 5));
: }
:
: 这个函数返回 a * x + b 的值,不会改变任何的系统状态变量。
:
: 一类复杂的 Pf 是递归的 Pf 。例如下面这个函数:
:
: int fibo(int n){
: if(n <= 2){ return 1; }
: else { return fibo(n-1) + fibo(n-2); }
: }
:
: 这个函数将会返回斐波那契数列的第 N 项。显然,这个函数也可以写成递推的版本,但这不是本文的重点。
:
: 以是否影响系统的状态(修改系统的状态)为分界,我们现在知道一些计算机指令可以认为在数学上属于 Pf ,一些则不属于 Pf。
:
: 与 Pf 相对,或者说一段计算机指令不属于 Pf ,其充分必要条件是其将改变系统变量的状态,这我们称为“副作用”,记为 Se 。注意,副作用并不等于不需要的作用,而是相对于系统状态的转移保持稳定不变而言是副作用。副作用有时候正是“正作用”。
:
: 一个简单的例子是 scanf 函数。考虑下面对 scanf 的调用:
:
: int main(void){
: int t;
: scanf("%d", &t);
: if(t == 0){ return 0; }
: else { return 1; }
: }
:
: 如果将 t 看成一个临时变量,那么是否调用 scanf("%d", &t); 就没有副作用呢?不是的。这个函数的调用将会消耗系统输入缓冲区中的内容。作为对比:
:
: printf("Result of applying a Pf : %d \n", LinearCompose(3, 2, 5));
: scanf("%d", &t);
:
: 系统输入缓冲区有什么,只有第二行被调用的时候才有改变,第一行并不会影响第二行。然而:
:
: scanf("%d", &t);
: scanf("%d", &t);
:
: 第一行会影响第二行,因为第一行执行完后已经消耗了系统输入缓冲区中的一些输入。于是第二行得到的输入将会不同。
:
: 更复杂的例子例如下面这个类:
:
: class Box{
: double width;
: double height;
: public:
: Box(double width, double height);
: double GetArea();
: double StretchToNewWidth(double NewWidth);
: };
:
: Box::Box(double _width, double _height): width(_width), height(_height) { };
:
: double Box::GetArea(){ return width * height; }
:
: double Box::StretchToNewWidth(){ width = NewWidth; }
:
: 显然,Box::GetArea 属于 Pf,其并不改变系统的状态,但是体现了对数据的观测、统计、综合,在这里是利用盒子宽度和高度的信息得出面积的信息。而 StretchToNewWidth 属于 Se,因为改变了盒子的宽度的数字化信息。
:
: 接着我们考虑两个连续的 Pf 或者 Se 。即 Pf^2 和 Se^2 。例如
:
: double width, height, area, area_square;
: width = 100; height = 200;
: area = width * height;
: area_square = width * width;
:
: 这段代码给临时变量 width, height 赋值,计算了 area, 然后计算了 area_square 。不严格地,我们认为这属于 Pf^2 。
:
: 显然,直观来看,Pf^2 意味着:进行了一个纯函数的计算,又进行了一个纯函数的计算;即,进行了两个纯函数的计算。
:
: 通过观察不难发现 Se^2 意味着:产生了一个系统的副作用,又产生了一个系统的副作用。
:
: 如果一段代码可以分成两个部分,而且这两个部分一个部分属于 Pf ,一个部分属于 Se ,我们就称这段代码属于 Pf^1 Se^1 。例如下面这段代码:
:
: double width, height, area;
: scanf("%d%d", width, height);
: area = width * height;
:
: 这段代码第2行属于 Se ,第三行属于 Pf 。这段代码属于 Pf^1 Se^1 。
:
: 通过观察不难发现 Pf^1 Se^1 有两种情况,即先 Pf 后 Se,及先 Se 后 Pf 。
:
: 我们这么考虑还有一定的偶然性,我们下面转入有内在联系的两段代码的观察,并且只考虑这两段代码中的每一段只属于 Pf 与 Se 中的一类。在时间上,我们可以认为一段先执行,一段紧跟着之后执行。由乘法原理,这样子的两段代码,作为一个整体,第一段可能是 Pf 或者 Se,第二段
: 也可能是 Pf 或者 Se,于是就有四种情况。特别地,我们只考虑第二段代码在第一段代码之后有必要性,即第二段代码依赖于第一段代码。于是就可以得到四种情况:
:
: Pf. Pf. -- 依赖于纯函数调用的纯函数调用。显然,这是两个纯函数的复合。这种情况体现了两个层次的规定性的整合,两个层次的抽象的规定性的整合。
:
: Pf. Se. -- 依赖于纯函数调用的副作用调用。这就是要根据一个纯函数的结果,而进行某种副作用。这种情况体现了一种抽象的规定性对系统的行为的实现的前导性,同时又体现了系统行为的受规定的独立性和可变性。
:
: Se. Pf. -- 依赖于副作用调用的纯函数调用。这值得详细的留意,即为什么后一个纯函数调用要根据前一个副作用调用。这种情况体现了一种抽象的规定性的生成,但这种抽象的规定性不是绝对的、凭空出现的,相反地,这种抽象的规定性的得出虽然已经是规定了的,但是其又体现为其前
: 提的系统的副作用的结果,体现为根据系统变化而生成的抽象的规定性,一种后系统的纯函数。
:
: Se. Se. -- 依赖于副作用调用的副作用调用。这也值得详细的留意,即为什么后一个副作用调用要根据前一个副作用调用。这种情况体现了一种一变,再变,而且这第二次变和第一次变具有内在的关联,体现了一种有层次又又关联地变化着的系统的特征。
:
: 如果一段代码可以分为严格前后相序不能突破的若 Q 个部分,且每一部分总是属于集合 Τ 的一个元素所代表的类,我们就说一段代码属于 Χ( Τ, Q ) 。显然,我们分析了 Χ( {Pf, Se}, 2 ) 。
:
: 作为一个不严谨的讨论, N=NP ? 可以认为是这样子的一个命题的真假值判断的等价描述:
:
: 任何 c ∈ Χ( C(N), x1 ) 总是存在一个 c' ∈ Χ( C(NP), x2 ) ,对于相同的输入 input, 只要 c 和 c' 能停机,总有 c(input) == c'(input) ,反之亦然。其中 C(N), C(NP) 表示能够在时间复杂度为 N, NP 前提下输出结果的代码。
: --
: ※ 修改:·darkk 于 Nov 23 13:45:59 2022 修改本文·[FROM: 117.136.0.*]
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 117.136.0.*]
--
修改:darkk FROM 117.136.0.*
FROM 120.245.94.*