0
votes

Y a-t-il un moyen plus pythonique de codage de cette relation récurrence Re: Oeis A077947

Je travaille sur une thèse concernant les séquences Jacobsthal (A001045) et la manière dont elles peuvent être considérées comme étant composées d'un certain nombre de sous-séquences distinctes. J'ai fait un commentaire sur A077947 en indiquant cela et j'ai inclus un programme Python. Malheureusement, le programme comme écrit laisse beaucoup à désirer et, bien sûr, je voulais passer à Stack pour voir si quelqu'un ici sait comment améliorer le code!

Voici le code: xxx

J'explique le raisonnement derrière cela comme suit:

La séquence A077947 est générée par 6 séquences de préservation de racines numériques cousu ensemble; par le code Python Ces séquences initient à la Valeurs de graines A-F. Le nombre d'itérations requises pour calculer une donnée A077947 A (N) est ~ N / 6. Le code lorsqu'il est exécuté renvoie toutes les valeurs de A077947 jusqu'à la plage (x), ou ~ x * 6 termes d'A077947. Je trouve le répété Racines numériques intéressantes comme je cherche la préservation des racines numériques périodiques dans les séquences comme méthode permettant d'identifier les modèles dans les données. Pour Exemple, les séquences de conservation des racines numériques permettent une analyse des séries chronologiques de grands ensembles de données lors de l'estimation du statut true-ou faux des alarmes en grand les écosystèmes qui subissent une maintenance (environnements mod7); Une telle analyse est également liée à la prévision de la demande des consommateurs / des schémas de comportement. Appropriant ces méthodes d'analyse, sculpture A077947 en 6 numériques Les séquences de préservation des racines visaient à réduire la complexité; le code Python reproduit A077947 sur 6 "canaux" avec des valeurs de graines A-F. Cette longue le paragraphe se résume à la déclaration: "Les racines numériques des termes de la répéter la séquence dans le motif (1, 1, 2, 5, 9, 9). "La déclaration plus grande est-ce que toutes les séquences dont les racines numériques se répètent avec un motif peuvent être partitionné / séparé en un nombre égal de séquences distinctes et de celles Les séquences peuvent être calculées indépendamment. Il y avait une prime liée à cette séquence.

Ce code est laid mais je ne peux pas sembler avoir la bonne réponse sans le coder de cette façon;

Je n'ai pas compris comment écrire cela comme une fonction en raison du fait que je ne peux pas sembler obtenir les valeurs de récurrence à stocker correctement dans une fonction.

donc bien sûr si cela Conspose de bons résultats Nous espérons relier la discussion aux références de l'OEIS.

Voici un lien vers la séquence: https://oeis.org/a077947


2 commentaires

Voulez-vous l'améliorer esthétiquement, la performance ou les deux? Il me semble que la réponse d'Alain est soignée.


Tous les deux; Je suis moins préoccupé par la lisibilité que la compacité. La séquence la plus intéressante est l'A001045, mais là où cette séquence est composée de 6 sous-préquendances indépendantes A001045 a quelque chose comme 18, obtenir une solution compacte ici permettra une bien meilleure solution sur A001045. Il y a beaucoup de ces types de séquences .....


4 Réponses :


0
votes

Cela se comportera de manière identique à votre code et est sans doute plus jolie. Vous verrez probablement des moyens de rendre les constantes magiques moins arbitraires. XXX

Pour calculer une seule des sous-séquences, il suffirait de garder i corrigé comme vous itérer.


3 commentaires

Traceback (appel le plus récent): fichier "testoeis.py", ligne 7, dans Facteurs [i] = i + cofacteurs [i] * (64 ** x) IndexError: index de liste hors de portée I Fixe ceci En changeant la ligne 6 pour lire: pour I dans la plage (6) et que cela obtient le code à exécuter, mais les valeurs ne sont pas identiques que celles produites par le code d'origine. Voir OEIS.ORG/A077947/B077947.TXT


Typo, désolé! Cela aurait dû être facteurs [i] , pas i . Maintenant, il correspond à votre séquence


Je le vois maintenant. Il génère la séquence souhaitée.



2
votes

Voici une solution alternative de le faire sans une seconde pour la boucle: xxx pré>

[modifier] En regardant les valeurs que j'ai remarquées que cette séquence particulière pourrait également être obtenue avec: p>

n [i + 1] = 2 * N [I] + (-1,0,1 en rotation) p>

ou p>

n [i + 1] = 2 * N [i] + i mod 3 - 1 (supposer un index à base de zéro) em> p> xxx pré>

donc une boucle plus simple pour produire la séquence pourrait être : P>

printSeq("A001045",20,lambda x,s,c,p: 64*s + 21*(-1)**(x*p+c),[0,1,1,3,5,11])


2 commentaires

Joli. Je n'ai pas vu [n = 2 * N + I% 3 - 1] du tout! Élégant.


Si cela est de valeur, chaque tiers d'entrée de la séquence est un nombre pair. Cela signifie que vous pouvez trouver la valeur suivante dans la séquence à partir de deux valeurs consécutives connues (sans connaître l'index) à l'aide de N [i + 1] = n [i] * 2 - N [i]% 2 + n [I-1 ]% 2 (semblable à la séquence Fibonacci)



0
votes

Voici une version alternative utilisant des générateurs: xxx pré>

et voici un moyen sûr de l'utiliser: p>

j = Jacobsthal()
for _ in range(10):
    print(j.send(None))


2 commentaires

N'essayez pas ca a la maison!


Ctrl + C est votre ami :-)



0
votes

Comme vous pouvez le voir à partir de l'annotation de l'OEIS, vous n'avez besoin que de 3 valeurs initiales et 1 récursives de 3 éléments de séquence précédents, A (N-1), A (N-2) et A (N-3). Vous pouvez ensuite obtenir facilement la série.

# a(n-1)+a(n-2)+2*a(n-3)
# start values: 1, 1, 2

a1, a2, a3 = 1,1,2 #initial vales
m3, m2, m1 = 1,1,2 #multipliers for a(n-1):m3 a(n-2):m2 and a(n-3):m1

print a1, a2, a3,
for i in range(16):
    a1,a2,a3=a2,a3,a3*m3+a2*m2+a1*m1
    print a3,


0 commentaires