Pourquoi评论组合 le博客du Goulu博士
le博客du Goulu博士

套房infinies en Python

Depuis que je program en Python,j'entasse les petits bouts de code utiles ou potentiallement réusibiliables dans«Goulib»,ma-libarie perso et néanmoins disponible en open-source(license LGPL)sur皮皮github,ReadTheDocs倾倒拉多克,avec des(平均值)笔记本Jupyter de démo。

Comme la valeur d'un code se mesure surtout par les tests quivérifient son bon functionnement,je me suis lancédans un ambitieux projet(de plus…):测试仪un maximum de functions de mes模块马特2et(等)itertools2en-calculant-des-suites-de-l'百科全书(en ligne des suites de nombres entiers),加上connue sous son缩写词anglais OEIS。

Pour cela j’ai fait un truc don je suis vachement-fier*:

La classe序列

总工程师容器(doc胚胎)代表团成员一套(英语顺序)结束你的提名儿子建造师:

  • iterf:un它的评价者ou geénérateur制片人《洛杉矶套房的术语》(les termes de la suite l'un après l'autre)
  • itemf:une function反击了leième paramètre de la suite
  • 包含:这是一个真实的场景。

关于佩特·克莱尔的典型例子,《安西》首映者拉塞里(infinie)des nombres:

A000040型=序列(containf=是素数(_P))

Ensuite,l'objet ainsi crééavec n'importe quelle combinison de ces 3 paramètres peutétre utiliséindifférement公司:

  • 巴黎市长:A000040中的p():打印(p)#affiche les nombres premires(jusqu'ál'infini)
  • 委员会名单:A000040[999]#renvoie le 1000ème nombre premier(parce que Python indiceápartir de 0…)
  • comme un合奏:201420142013,A000040#renvoie True car ce nombre est premier。

清创术,治疗功能加疗效pour chacun de ces paramètres,治疗peut les utiler pour rendre les calculs bien plus rapides。关于peut explorer trois算法差异的Par example pour la suite de Fibonacci:

A000045号=序列(iterf=斐波纳契根,项f=斐波那契,包含=is_fibonacci公司)

顺便,语音评论est définie la séquence«auto descriptrice»quiorne la bannière de l’OEIS ci-dessus:

A005150型=序列(重现(λx:数字_来自_位数压扁互换压缩数字(x) ),1))

紧凑型和preque clair,不是吗?

Dérivation公司

Une Sequence peutátre dérivée e d'Une autre gráceáplusieurs方法:

  • 滤波器反致序列与序列源过滤功能相对应。Par示例:
    A000043号=A000040.过滤器(数学2.lucas-lehmer)
    《默森展览》(exposants de Mersenne),《诺姆布雷斯首映式》(les-nombres premires p tels que)(2^p–1)est premier。
  • 应用序列源的功能变更贴花。例如,《红楼梦》首映者佩特·塞·德菲尼尔·安西(la série des carrés des nombres premiers peut se définir ainsi):
    A001248号=A000040.适用(λn:n*n)
  • 将“利用”应用于简单的琐事,将“附加”应用于完整的序列。Par示例:
    A000215号=A001146号+1
    有限域费马命名形式命名部分(2^{2^n})
  • 积累在《序列》的首映式上,《序列》的术语来源:
    A007504号=A000040.累计()
  • 成对地反致序列产生贴花贴花功能,并对其进行分类。Ainsi la suite des differences entre nombres premiers consécutifs s'écrit:
    A001223号=A000040.成对(operator.sub)

关于peut aussi组合器deux Sequences pour en créer une nouvelle:

  • L'opérateur%(模数,pourquoi pas……)反致于pas dans L'opérande de droite上的gauche quine序列术语。艾恩斯:
    A007510号
    =A000040%A001097号
    首字母序列限定果汁
  • L'opérateur和(和)renvoie les termes de la Sequence opérande gauche quisont aussi dans L'opèrande droite。艾恩斯:
    A020449号=A007088号&A000040型
    définit la suite des nombres premiers不要求“紧急状态”的0和1。
  • L'opérateur|(或)反致:双重后果的融合heapq.merge(堆合并)艾恩斯:
    A030513型=A030078型|A006881号
    définite les nombres ayant 4除数(don 1 et eux-mímes)comme l'union de ceux qui sont le produit de deux nombrespremiers avec ceux que sont lecube d'un nombre premier。

Il y a encore diux methodes un peu«tirées par les cheveux»du point de vue matique,mais qui functionnent très bien information:

  • 分类反致序列单调牛角面包(par défaut)en triant les termes de la Sequence d’origine。例如,voici la suites des surfaces des三联体食腐菌dans l'ordre牛角面包:
    A024406美元=序列(math2.primitive_triples).apply(lambda x:x[0]*x[1]//2).sort()
  • 独特的反致序列o'les termes redondants de la suite d'origine sont缺席,例如:
    A001097号 =A077800型.unique()//oui,parce que le 5 appartientádeux paires de nombres premiers jumeaux…

塞斯梅特德利用尊重itertools2.sorted可更改et(等)itertools2.独特这是一个首字母缩写为“presque”的三元组合,它是一个不包括“缓冲区”参数的术语(a_i+n\leq a_i\)。在peutévidemment trouver des suites qui ne pourront«mathematiquement»pasétre traitées ainsi上,mais informatiquement j’arriveáreproduire les suites de l'OEIS rencontrées jusqu'ici avec buffer=100 seulement

OEIS字典

J'ai ainsi constituépeuápeu le fichier公司oeis.py公司《150年代OEIS环境的公平行动》(quidéfinite actuellement environ 150 séries de l'OEIS,et que jétoff lorsque l'ocasion se presente)。作为一个最终的模块,j'use la géniale possibilityéd'introspection de Python pour recurpower toutes les Sequence définies dans un dictionnaire fort utile pour les tests:

#Construit le dictionnaire OEIS par自省:简单和惊喜!oeis={}#关于字典的参考seqs=globals().copy()#在copie tous les objets déclarés dans ce模块上对于seqs中的id:#关于parcourt tous les identicateurs des objets如果id[0]==‘A’和len(id)==7:#et‘ils ont un nom de sésequence OEIS。。。oeis[id]=seqs[id]#在les ajoute au dictionnaire上。。。seqs[id].name=id#et关于définit leur champ name

性能

最重要的一点是计算出最有效的公民行动。使用序列定义了函数iterf、itemf、containf和leurséventuelles组成的序列。

在“自动魔法”中,mais il faut tout de méme veileráuseler les algorithmes les plus efficies,et C’est mém eun des buts que je poursuis avece projet。例如,首映的提名套房不需要“犯罪记录”
A020449号=A007088号&A000040型
aurait pu s'écrireégalement公司:
A020449=A000040和A007088
mais la première formulation est beaucopus plus rapide car la série A007088 des nombres ne s'e crivant qu'avec des 0 et des 1 cro峘t beaucopus+vite que celle des nombers premires A000040《超级美食家配方》。《最具代表性的Beaucoupt和rapide de tester是1101010101011101首歌曲的类型命名》首映式《16首奇弗莱斯和jeter ceux que contiennent d'autres chiffres que des ou 1》首映。

Malgré吹嘘“公共安全”、“私人套房”、“临时雇员”、“白痴”、“同事”、“儿子”、“总统”阿尔雷问题.J'ai doncécrit un先生décorateur(j’adore!)计算布克莱西的温度限制:

对于x个在里面 装饰器.itimeout(suite,1):打印(x)#affiche tous les termes calculatables en 1 seconde(au total)

Ce décorateur est utiliéen particulier丹打印上诉法院功能顺序__代表__pour afficher les dix首映词“une Sequence”,“ou du moins ceux qu’on peut calculer en moins d'une seconde”。

Les suites particulèrement lentes堪称典范A007508年A035533号不要把我的名字写在donne le nombre de nombres inférieursé10^n满足特定条件。Faute de meilleur算法,chaque terme prend 10x+de temps que le précédent…

测验

好了,我们的测试仪是功能校正的beaux算法,虽然是简单的,但却是初始的je le rapelle。

Pour ceci,il suffit de vérifier que chaque Sequence fournit bien les mémes termes que ceux disponibles dans l’OEIS。Ceci est facilitépar le fait que l’OEIS fournit pour chaque suite les n premières valeurs dans un fichier texte en酒店设施格式maison«B文件»可访问的par le web。Par示例https://oeis.org/A000040/b000040.txt四部十万部首映,提名首映。

Donc mon fichier公司测试环境.pyest lui aussi génialement simple*:il travel le dictionnaire oeis et pour chaque Sequence il télécharge les N termes de référence du site oeis,vérifie que les N premiers termes des la Sequence sont bien ceux attentus,et produit une erreur sinon。我们避免了10个月的限制。

Ces测试自动化测试(avec beaucoup d'autres)苏·特拉维斯-CIchaque fois que je pousse une nouvelle版本GitHub河畔古利卜,ce qui fait que je suis averti si modified cre e un problème avec une ancinne version de Python ou un Pingouin détecte un probleme invisible de mes Fenétres。

Débogage…de l'OEIS!

J'ainsi beaucoup débogué,amélioréet optimiséla functions de多功能古利卜.math2et beaucound’(与博阿库奇德)itertools2,et je compte poursuivre dans cette voie qui permet d'utiler les données de l'OEIS comme une référence,validées par de nombreux utiateurs。

Sauf que des fois,le bugétait chez eux餐厅。我也很高兴埃弗里·普科里奇欧亚大陆:

  • A121727号,梅塞·迪安·梅坦斯(comme déjámentionnédans)cet文章,le20ème terme de la série est 145,pas 142。
  • A036275号,不要确定除了0个补给品之外的可用术语。Tant qu'a faire j'ai fourniun B-file contentant les 1000 premiers termes requis pour remplacer l'ancien quin’en avait que 500(第四个B级文件)。

这是一个重要的时刻,《世界经济展望》是一个充满活力的节日,也是一个为丁香贡献力量的节日。现代项目的基础服务加上交互,利用代码(当然是Python)来计算所需的套件动态…

Ce long article mijotépensel加上6个mois se termine par un appel auxdu代码的诱惑博内斯·沃伦特斯(bonnes volontés):这篇文章给了我们一个动力,那就是GitHub河畔古利卜的贡献。

倒入ma-part je m'attaque aux无名自恋et(等)弗里德曼(nombres de Friedman)qui-seront l’occusion de nettoyer le code du网络安全规范杰·德兰内伊利用et测试le模块Goulib.expr公司

笔记

*我的谈判方式是…
**你的目标是为安可剧团表演…

自由放任

投票地址电子邮件ne-sera pas publieée。 冠军的义务是独立的*

Ce站点使用Akismet pour réduire les indésirables。En savoir plus sur comment les données de vos commentaires sont utiliées(恩萨维尔附加评论).

2条评论”套房infinies en Python