;;;; 计算A000203,sigma(n),n的除数之和的两个方案实现。;;;; 由Antti Karttunen多年来撰写。此独立源文件的第一版于2017-11-27编制。;; 另请参阅https://github.com/karttu/IntSeq网站;;;;(声明(通常整合));; 首先是memoization-macro definec的实现。;; 另请参见http://oeis.org/wiki/Memoization#方案;; 添加了这10个。2002年7月,避免分配灾难;; 由于粗心使用缓存的整数函数导致:(定义*MAX-CACHE-SIZE-FOR-DEFINEC*362881);;是:290512);;是131072(定义-语法-定义(语法规则()((定义(名称参数)e0…)(定义名称(实现缓存函数*MAX-CACHE-SIZE-FOR-DEFINC*(名称arg)e0…)) ;; (定义名称…))) ;; 句法规则)(定义语法增长缓存(语法规则()((增长缓存缓存名称arg);;未指定最大大小。(矢量增长缓存名称(最大值(1+arg)(*2(矢量长度缓存名称))))((增长缓存缓存名称arg 0);;或指定为零。(矢量增长缓存名称(最大值(1+arg)(*2(矢量长度缓存名称))))((增长缓存缓存名称arg maxsize)(矢量增长缓存名称(最小最大大小(最大值(1+arg)(*2(矢量长度缓存名称)))))))(定义语法实现缓存函数(语法规则()((实现缓存函数maxcachesize(funname argname)e0…)(letrec((_缓存_(向量#f#f#f#f#f#f#f#f#f#f#f#f#f#f))(趣味名称(lambda(参数名)(cond((空?参数名)缓存);;用于调试。((向量?参数名)参数名);;还有:缓存就是缓存!((和(不是(=0 maxcachesize))(>=argname maxcachesize))e0。。。)(否则(如果(>=参数名(矢量长度缓存))(设置!缓存_(增长缓存_参数名最大缓存大小)))(或(矢量引用缓存参数名)(λ(res)(向量集!缓存argname res)物件)(开始e0…))))) ; 康德))) ; letrec-定义有趣的名字);letrec公司)));; MIT/GNU方案有一个函数向量-grow;; 对于其他一些方案,您需要单独实施。;; 下面是来自的一个实现;; https://github.com/karttu/IntSeq/blob/master/src/utils/vector-grow.scm;; ;; (定义(vector-grow old-vec new-size);; (let((new-vec(make-vector new-size#f));; (旧尺寸(矢量长度old-vec));; );; (让copyloop((i 0));; (cond(=旧尺寸)新矢量);; (否则;; (开始;; (vector-set!new-vec i(vector-ref old-vec ii));; (复制循环(+1 i)););; );; );; );; );; );;;; 如果您没有使用A000203旧版本的sigma,请注释以下两行。;; (或者在安装SLIB后,至少在那里编辑一个合适的路径!)(加载“c:\\program files(x86)\\slib\\mitscheme.init”);;SLIB方案库:http://people.csal.mit.edu/jaffer/SLIB(要求系数);;从SLIB库。;; 我们的因子版本将基本因子按升序排序,并将其缓存:(definec(ifactor n)(cond((<n 2)(list))(else(sort(factor n)<)));; 例如:;; (ifactor 360)-->(2 2 2 3 3 5);; (元件对(ifactor 360))-->((2.3)(3.2)(5.1))(define(elemcountpairs lista);;已排序的数字元素的。(let循环((对(列表))(李斯特)(上一个#f))(cond(不是(pair?lista))(反向!pairs))((等于?(汽车列表)上)(set-cdr!(汽车对)(+1(cdar对))(循环对(cdr-lista)上一个))(else;;一个新项目?(循环(cons(cons,car lista)1)对)(cdr lista)(car lista))))));; %F A000203与a(p^e)=(p^(e+1)-1)/(p-1)相乘大卫·W·威尔逊,2001年8月1日。(定义(A000203旧n)(左折(λ(预测值)(*预测值)1(如果(=1 n)(列表)(元件对(ifactor n));;(排序(系数n)<)));; 新的递归版本不需要任何因子分解机制,因此不需要额外的库:(定义(A000203 n)(如果(=1 n)n个(设((p(A020639 n))(e(A067029 n)))(*(/(-(导出p(+1 e))1)(-p 1))(A000203(A028234 n)))));; A020639[David W.Wilson]Lpf(n):最小素数除以n(a(1)=1)。;; 这种实现可能看起来过于天真,但实际上,由于记忆;; 当反复使用不太大的参数时,它可以很好地工作。;; 正是这个函数为这些实现提供了“因子分解服务”。(定义(A020639 n)(如果(<n 2)n个(let循环((k 2))(cond((零?(模n k))k)(其他(循环(+1 k))))));; A028233[Marc LeBrun]o=1:如果n=p_1^e_1*…*p_k^e_k,p_1<…<p_k素数,则a(n)=p_1^e_1(定义(A028233n)(如果(<n 2)n个(设((lpf(A020639 n)))(let循环((m lpf)(n(/n lpf)))(cond((非(零?(模n lpf)))m)(else(循环(*m lpf)(/n lpf)))))));; A028234[Marc LeBrun]o=1:如果n=p_1^e_1*…*p_k^e_k,p_1<…<p_k素数,则a(n)=n/p_1^e_1。(定义(A028234 n)(/n(A028232 n));; A032742[Patrick De Geest]o=1:a(1)=1;对于n>1,a(n)=n的最大真除数。(定义(A032742 n)(/n(A020639 n));;a(1)=1;对于n>1,a(n)=n的最大真除数。;; A067029[Reinhard Zumkeller]o=1:n的素因式分解中的最小素因子指数,a(1)=0(定义(A067029 n)(如果(<n 2)0(let((mp(A020639 n)))(让循环((e0)(n(/n mp)))(条件((整数?n)(循环(+e 1)(/n mp)))(其他e))))));;;; 伙计们,现在就到此为止!有很多其他的序列可以很容易地定义;; 只使用A020639、A028233、A028235和A067029。有一天我可能会在这里添加它们。;;