dprtl a écrit : ↑19 mai 2017 20:21
Code : Tout sélectionner
10 INPUT"k";K:INPUT"n";N:R=N:IFK<0 THEN30
20 FORI=1 TOK:R=ROUND(R+SQR(R),-1):NEXT:GOTO40
30 FORI=1 TO-K:R=R-INTSQR(R):NEXT
40 PRINT"f^";K;"(";N;") =";R:GOTO10
Le résultat ci-dessous est calculé en 1 min 7 s environ :
J'aime bien cette approche, où l'on entre une valeur positive ou négative de
k en fonction du sens de la transformation et du nombre d'appels composés souhaité. Du coup, j'ai modifié mes codes initiaux car j'avais envisagé la chose différemment et cette dernière façon de faire est tellement plus pratique.
Pour SHARP PC-1211, cela donne le code suivant:
Code : Tout sélectionner
1:" " AREAD N:F=N,K=1:INPUT "^";K // Saisie de n et facultativement de k
2:FOR E=1 TO ABS K // Boucle pour chaque composée
R=INT √F // Selon le sens du caclul (càd le signe de k)
, F=F+R*SGN K+(√F>.5+R)*(K>0) // ajoute ROUND(SQRT(n)) ou retire FLOOR(SQRT(n))
:NEXT E // avec ROUND effectué en deux opérations car non disponible
3:"=" PRINT F;" = F^";K;"(";N;")":END // Affichage peut être simplifié
Mais, c'est toujours une résolution à l'aide d'une boucle. Et cela rend les déterminations d'autant plus longues que les composées sont nombreuses.
En étudiant de plus près certains cas de composées, je me rends compte qu'il y a une évolution régulière des valeurs
f^k(n) en fonction de
k.
D'où le code ci-dessus 'vectorialisé', c'est à dire sans boucle de calculs:
Code : Tout sélectionner
1:" " AREAD N:K=1:INPUT "^";K // Saisie de n et facultativement de k
2:R=INT √N,R=R+(√N>.5+R),E=INT .5K,F=E-R+INT √N+(K>2E),F=N+NK+EF // Calculs de R,E puis F
3:"=" PRINT F;" =^";K;N:END // Affichage peut être affiné
Variables :
Code : Tout sélectionner
N Entier anturel n saisi par l'utilisateur à l'aide de [shft][spc] en mode DEF
K Nombre et sens des composé : k positif détermine les composées f^k(n)
k négatif détermine les composées réciproques
Par défaut K=1, le code détermine donc x = f(n) le n-ième entier non carré parfait.
R Entier le plus proche de √n. Le SHARP PC1211 n'ayant pas de fonction ROUND, calcul en deux étapes
E Partie entière de K/2 qui permettra de calculer FLOOR(k/2) et CEIL(k/2) sur ce SHARP dépourvu
F Résultat du calcul F := n + k.ROUND(√n) + FLOOR(k/2).CEIL(k/2)
Exemples d'applications:
Code : Tout sélectionner
Calcul de f(1e6):
Affichage Saisie Remarques
3:"="PRINT F;"=^";K;N [mode][mode] Après sasiie du code, passer en mode DEF
> [Exp][ 6 ][shft][spc] Saisie de n = 1 000 000
^_ [ENTER] Pas de composé, taper ENTER directement
1001000.=^1.1000000. Le millionième entier non carré parfait est 1001000.
il y a en effet 1000 carrés parfaits entre 1 et 10^6 !
25/05/2017: EDIT : Attention ce qui suit est erroné, il faut lire 1629 et non pas 1627 - voir posts suivants :
Code : Tout sélectionner
Trouver le rang de 1669:
Affichage Saisie Remarques
[cl] Efface affichage.
> [1][6][6][9][shft][spc] Sasir 1669
^_ [-][1][ENTER] Demander la réciproque c.à.d. la composé (-1) fois
1627.=^-1.1669. 1669 est le 1627-ième entier non carré parfait
[shft][spc][ENTER] Vérifions cette allégation
1669.=^1.1627. Le 1627-ième entier non carré est donc bien 1669
25/05/2017: EDIT : Attention ce qui suit est erroné, la réponse à Q2 est qu'il n'y a pas de solution - voir posts suivants :
Code : Tout sélectionner
Q1:1406[shft][spc]15[ENTER] 2017.=^15.1046 d'où f^15(1406) = 2017.
Q2:2017[shft][spc]-20[ENTER] 1207.=^-20.2017. n = 1207
Q3:4867[shft][spc]-50[ENTER] 1967.=^-50.4867. n = 1967
Q4:4072325[shft][spc]-2017[ENTER] 1019091.=^-2017.4072325. n = 1019091
Faire attention cependant, ce code peu donner avec les composées inverses (k négatifs) des résultats aberrants.
En particulier dans le cas de détermination du rang d'un entier carré parfait:
Ce qui ne signifie pas que 25 est le 20-ième entier non carré parfait. En réalité 25 est un carré parfait qui se trouve entre f(20) et f(21) (soit entre 24 et 26 ) !!
Il doit être possible d'ajouter un test en ligne 1: pour détecter une telle situation ?
Voici une version équivalente pour HP41C.
Code : Tout sélectionner
001 LBL"MPO79" 011 2 021 ST- Y 031 ST+
002 FIX 0 012 R^ 022 ST- Y 032 *
003 RCL Y 013 ST+ L 023 x<>y 033 +
004 SQRT 014 X<> L 024 ABS 034 END
005 INT 015 RDN 025 ST+ Z
006 LastX 016 / 026 X<> Y Usage :
007 RND 017 ST* L 027 x<0? 1406 [ENTER^] 15 [XEQ][Alpha]MPO79[Alpha]
008 - 018 X<> L 028 DSE Y affiche 2017.
009 x<>y 019 LastX 029 ABS
010 ST* L 020 INT 030 RDN
La difficulté de retranscription, rencontrée en traduisant le code BASIC, provient du fait du comportement diffèrent de l'instruction INT sur HP-41C par rapport aux pockets SHARP
En effet,
INT -7.5 donne avec le SHARP la valeur entière
-8. L'instruction INT est donc bien une sorte de fonction FLOOR.
Alors que l'INT de l'HP-41C donne la partie entière de l'argument, ce qui signifie que
7.5 CHS INT donne
-7