Frazioni ordinate

Il forum di Base5, dove è possibile postare problemi, quiz, indovinelli, rompicapo, enigmi e quant'altro riguardi la matematica ricreativa e oltre.

Moderatori: Gianfranco, Bruno

Rispondi
franco
Livello 9
Livello 9
Messaggi: 1364
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

Frazioni ordinate

Messaggio da franco »

Calcoliamo e ordiniamo per valore crescente tutte le frazioni inferiori a 1 e con denominatore inferiore a un milione.
Quali sono le frazioni immediatamente prima e immediatamente dopo $1794/2022$ ?
(possibilmente senza chiederlo a Decimal Basic :))




Problema pubblicato da Jean Moreau de Saint Martin su La Jaune et la Rouge maggio 2022
www.diophante.fr
A20415
Franco

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

Quelo
Livello 7
Livello 7
Messaggi: 789
Iscritto il: ven giu 16, 2006 3:34 pm

Re: Frazioni ordinate

Messaggio da Quelo »

$\displaystyle \frac{1794}{2022}=\frac{299}{337}=0,887240356$
Dobbiamo trovare i due numeri $x$ compresi tra 1 e 336 per cui $\displaystyle y=\frac{299x}{337}$ è il più vicino possibile ad un intero, in più e in meno
$\displaystyle \begin{cases}
x_1 = 133;\;y_1=118,00296736 \\
x_2 = 204;\;y_1=180,99703264
\end{cases}$

Andiamo a sottrarre dalla frazione uguale a 299/337 con denominatore più grande (inferiore a 1.000.000)

$\displaystyle \begin{cases}
\Large\frac{887133-118}{999879-133}=\frac{887015}{999746}=\normalsize 0,887240359\\
\Large\frac{887133-181}{999879-204}=\frac{886952}{999675}=\normalsize 0,887240353\\
\end{cases}$
[Sergio] / $17$

franco
Livello 9
Livello 9
Messaggi: 1364
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

Re: Frazioni ordinate

Messaggio da franco »

Bene Sergio,

i tuoi risultati coincidono con quelli che ho trovato io con Visual Basic per Excel:
frazioni ordinate.jpg
frazioni ordinate.jpg (9.55 KiB) Visto 391 volte
Questa è la routine che ho usato:

Codice: Seleziona tutto

Sub FrazioniOrdinate()

NumT = 1794
DenT = 2022
NumL = 1793
DenL = 2022
NumH = 1795
DenH = 2022

FracT = NumT / DenT           'target 1794/2022
FracL = NumL / DenL           'valore basso di primo tentativo 1793/2022
FracH = NumH / DenH           'valore alto di primo tentativo 1795/2022

DeltaL = FracT - FracL
DeltaH = FracH - FracT

For D = 1 To 999999           'testa tutti i denominatori sotto il milione
    NL = Int(D * FracT)       'numeratore basso quello appena inferiore o uguale alla frazione target
    NH = NL + 1               'numeratore alto = num basso +1
    FL = NL / D
    FH = NH / D
    
    If FL <> FracT Then       'escludi dal check le frazioni equivalenti a 1794/2022
        DL = FracT - FL
        If DL < DeltaL Then   'se il delta verso il basso è minore del precedente usa la nuova frazione come riferimento
            NumL = NL
            DenL = D
            FracL = NL / D
            DeltaL = DL
        End If
        
        DH = FH - FracT
        If DH < DeltaH Then   'se il delta verso l alto è minore del precedente usa la nuova frazione come riferimento
            NumH = NH
            DenH = D
            FracH = NH / D
            DeltaH = DH
        End If
    
    End If

Next D

'stampa i risultati sul foglio excel
Cells(1, 1) = NumL
Cells(1, 3) = DenL
Cells(2, 1) = NumT
Cells(2, 3) = DenT
Cells(3, 1) = NumH
Cells(3, 3) = DenH

End Sub
Franco

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

Quelo
Livello 7
Livello 7
Messaggi: 789
Iscritto il: ven giu 16, 2006 3:34 pm

Re: Frazioni ordinate

Messaggio da Quelo »

VBA, scelta interessante :D

Io la controprova l'ho fatta con Python

Codice: Seleziona tutto

a = 1794
b = 2022
g = 6

e = [0,1]
f = [1,1]

for c in range(1,10**g):
    d = round(c/b*a)
    if (d/c < a/b) & (a/b-d/c < a/b-e[0]/e[1]):
        e[0] = d
        e[1] = c
    if (d/c > a/b) & (d/c-a/b < f[0]/f[1]-a/b):
        f[0] = d
        f[1] = c
print(a,b,a/b)
print(e, e[0]/e[1])
print(f, f[0]/f[1])
1794 2022 0.887240356083086
[886952, 999675] 0.8872403531147623
[887015, 999746] 0.887240359051199
Nessuno dei due ha usato Decimal Basic :wink:
[Sergio] / $17$

franco
Livello 9
Livello 9
Messaggi: 1364
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

Re: Frazioni ordinate

Messaggio da franco »

Quelo ha scritto:
mar ott 18, 2022 9:22 pm
Nessuno dei due ha usato Decimal Basic :wink:
Infatti mi ero tenuto la porta aperta per il mio VBA :)

Non conosco Pyton ma è impressionante quante poche righe di codice siano necessarie!
So di essere stato abbastanza prolisso (i commenti e un po' di variabili potevo lasciarle fuori) ma anche ottimizzando la routine col Basic si va molto più lunghi ...
Franco

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

Quelo
Livello 7
Livello 7
Messaggi: 789
Iscritto il: ven giu 16, 2006 3:34 pm

Re: Frazioni ordinate

Messaggio da Quelo »

Io ho cominciato a programmare negli anni 80 con il Basic (quello del C=64 per intenderci), poi VB/VBA, sempre da autodidatta
Negli anni 2000, dopo l'iscrizione al forum, Decimal Basic
Non ho mai affrontato i linguaggi più blasonati (Java, C++, ecc...) ma di recente ho scoperto Python e devo dire che mi trovo bene, è abbastanza facile ma comunque versatile e potente.
[Sergio] / $17$

Rispondi