Blog Feed

Petits problèmes de logique résolus avec python (énoncés)

La plupart des problèmes proposés sont extraits du Championnat des Jeux Mathématiques et Logiques organisé par la FFJM. Ils sont donc conçus pour être résolus juste avec la tête mais c’est là qu’on constate que programmer fait gagner beaucoup de temps.

Certains problèmes peuvent avoir plusieurs solutions.

Il faudra veiller à ce que les programmes ne soient pas trop complexes. Il ne faut pas que le temps d’exécution soit supérieur à 5 minutes.


Année et nombres premiers

Le nombre 2018 est le double d’un nombre premier, 1009, et le
successeur d’un autre nombre premier, 2017.
Quelle sera la prochaine année dont le numéro sera à la fois
double et successeur d’un nombre premier ?

Pour cela, il faudra réaliser une fonction premier de paramètre n un nombre entier et qui retourne True si n est premier et False dans le cas contraire.


Palindromie Carrée

On calcule la somme des carrées des nombres entiers naturel, dans l’ordre : 0²+1²+2²+3²+4²+… On arrêtera le calcul dès que, après avoir ajouté le carré d’un nombre palindrome ayant au moins deux chiffres, on obtiendra une somme qui est aussi un nombre palindrome.

Quel sera alors le dernier carré ajouté ?

Pour cela il faudra réaliser une fonction palindrome de paramètre n un nombre entier et qui retourne True si n est un nombre palindrome et False dans le cas contraire.

Pour information, un nombre palindrome est un nombre qui peut se lire dans les deux sens, c’est-à-dire que la séquence de ses chiffres est la même lorsque il est lu de droite à gauche ou de gauche à droite.


Devine âge

L’âge d’Agathe a exactement six diviseurs entiers naturels en comptant 1 et lui-même. Le produit de quatre diviseur est égal à 72, l’âge de sa grand-mère Mathilde.

Quel est l’âge d’Agathe ?

Pour cela il faudra réaliser une fonction diviseur de paramètre n un nombre entier et qui retourne la liste de ses diviseurs ainsi que le nombre de ses diviseurs.


Trois nombres premiers

Le produit de trois nombres premiers est égale à 11 fois leur somme.

Quels sont ces trois nombres dans l’ordre croissant ?

On rappelle qu’un nombre premier est un nombre admettant exactement deux diviseurs : 1 et lui-même.

Pour cela, il faudra réaliser une fonction premier de paramètre n un nombre entier et qui retourne True si n est premier et False dans le cas contraire.

Il sera également possible d’effectuer un calcul simple de complexité pour choisir le plus grand nombre à étudier.


L’âge de MAtt Usalem

Matt Usalem est un grand-père de plus de 80 ans (mais de moins de
150 ans). Aujourd’hui, il peut dire à ses deux petits enfants, qui ont
des âges différents :
« Le produit de nos trois âges est égal à la somme des carrés de nos
âges ».

Quel est l’âge de Matt Usalem ?


Palindrome carré

Mathias vient de trouver un nombre palindrome à trois
chiffres qui est le carré d’un nombre entier.

Quel est ce nombre ? (Il y a 3 solutions)

Pour cela il faudra réaliser une fonction palindrome de paramètre n un nombre entier et qui retourne True si n est un nombre palindrome et False dans le cas contraire.

On rappelle qu’un palindrome est un nombre qui
se lit de la même façon de gauche à droite et de droite à
gauche, comme 252 par exemple.


L’anagramme sextuple

Mathias a trouvé un nombre de quatre chiffres étonnant. Lorsqu’on
le multiplie par 6, on obtient un nombre de quatre chiffres qui
s’écrit avec les mêmes chiffres rangés dans un ordre différent.

Quel est le nombre de Mathias ?


Les solutions de ces problèmes avec les programmes qui ont permis de les résoudre sont disponibles ici. La page est cependant protéger par mot de passe, contactez moi pour l’obtenir.

Si vous avez des questions concernant les énoncés n’hésitez pas à les poser en commentaire.

Se déplacer sur Terre

Il paraît évident que le chemin le plus court entre deux villes est la ligne droite. C’est vrai sur une courte distance mais dès que l’on prend un peu de recul on s’aperçoit que la Terre n’est pas plate (eh oui) et la ligne droite perd du sens sur une sphère.

Il existe donc deux distances caractéristiques sur Terre:

L’orthodromie et la loxodromie

La loxodromie correspond à la ligne droite sur le planisphère mais ce n’est pas le chemin le plus court. En effet, l’orthodromie est le chemin le plus court et c’est pour cette raison que les avions ont un drôle d’itinéraire lorsqu’on regarde sur une carte.

Pour mieux visualiser la différence entre orthodromie et loxodromie allez voir ce site avec une magnifique animation.

Intéressons nous maintenant aux mathématiques avec le calcul de l’orthodromie.

Notons :

  • λD la latitude de départ
  • φD la longitude de départ
  • λA la latitude d’arrivée
  • φA la longitude d’arrivée

Considérons la Terre comme une sphère parfaite et plaçons un repère orthonormal direct placé en son centre. Nous noterons par la suite Rt le rayon de la Terre.

Commençons par observer la distance si nous nous déplaçons sur le même méridien.

Il s’agit de calculer ici la longueur d’un arc de cercle de rayon Rt. L’angle de cet arc correspond alors à α =| λD- λA|. Nous pouvons donc déduire la distance D :

De même, si nous nous déplaçons sur la même longitude nous aurons :

Nous pouvons alors comprendre que pour obtenir la distance entre les 2 villes il faut se ramener à un problème dans le plan formé par l’origine du repère et les deux villes comme le représente la figure 1.

Figure 1

Pour cela tentons de déterminer l’angle de l’arc grâce aux vecteurs. Nous allons noter D la ville de départ et A la ville d’arrivée pour obtenir :

Appliquons le produit scalaire :

Or :


Par formule d’addition du cosinus:

D’où :

Et donc :

Revenons alors au calcul de la distance maintenant que nous avons déterminé l’angle :

Nous obtenons donc :

Avec D de la même unité que Rt et les angles en degrés

Vous trouverez sur ma page github (le lien est dans la page « À propos de moi ») un programme en python avec interface graphique en Tkinter qui calcule l’orthodromie. Je détaillerai ce programme en détail dans un prochain article.

Mise à jour Uconnect 5′

Si vous n’arrivez plus à connecter votre téléphone en Bluetooth depuis la mise à jour Android 11 ou IOS 10 ou que vous rencontrez des ralentissements voire des coupures su système, il est temps de réaliser la mise à jour.

Je vous propose ici la procédure pour mettre à jour l’ordinateur de bord de vos véhicules Fiat équipés du système Uconnect 5′

Cela concerne tous les véhicules avec ou sans GPS (je n’ai pu tester uniquement sur une Fiat 500 sans GPS)

Préparation de la clé USB

Tout d’abord téléchargez les fichiers de la mise à jour sur votre ordinateur :

mega.nz/#!JMNUgIiA!ABsCmJi_MhKAMItw65fPRxQElGcF4KPWTvIxzrwH6M4

Formatez par la suite une clé USB de 2Gb à 16Gb en fat32.

Décompressez l’archive téléchargée et copiez tous les fichiers sur la clé USB

Installation de la mise à jour

Allumez le moteur de votre voiture et insérez la clé USB sur le port dédié aux données de la voiture.

Attention : Le moteur doit rester allumé tout le long de la mise à jour

La mise à jour est alors automatiquement proposé environ 3 minutes après avoir inséré la clé USB, validez et la mise à jour démarre.

La mise à jour est terminée, n’hésitez pas à écrire en commentaire le modèle de votre véhicule

Home Assistant sur Raspberry Pi

Home Assistant est un serveur domotique compatible avec la quasi totalité des dispositifs connectés et la liste s’agrandit chaque jour.

Pour l’installer, préparez :

  • Un raspberry pi 3 ou 4
  • Son alimentation ( 2,5A minimum pour un bon fonctionnement )
  • Une carte micro SD de 32 GB ou plus de classe 10
  • Un PC avec Etcher d’installé
  • L’image de Home Assistant de téléchargée ( ici pour le pi 3 et là pour le pi 4 )
  • Une connexion en ethernet est nécessaire pour avoir un fonctionnement optimal ( il sera possible une fois l’installation terminée de se connecter en Wifi )

Une fois tous les éléments réunis, insérez la carte SD dans votre PC et écrivez l’image de Home Assistant sur la carte avec Etcher.

Une fois l’écriture terminée, insérez la carte SD dans le Raspberry pi et démarrez le.

Le premier démarrage prendra une bonne demi-heure car il télécharge et configure la dernière version de Home Assistant. Après cette pause, connectez vous sur le PC à l’adresse http://homeassistant.local:8123 ( ou directement avec l’IP avec le port 8123 ). Vous allez devoir créer vos identifiants de connexion puis configurer de façon semi-automatique les premiers modules.

Commençons maintenant la personnalisation avec l’insertion de nouveaux modules, la création de groupes.

Pour faciliter l’édition des fichiers, j’ai réaliser un petit programme en bash pour accéder directement aux fichiers de paramétrages et les modifier avec nano :

#!/bin/bash

echo "###############################################"
echo "#Modification des paramètres de Home Assistant#"
echo "###############################################"
echo ""
echo "Liste des fichiers modifiables : "
echo "1) automations"
echo "2) configuration"
echo "3) groups"
echo "4) scenes"
echo "5) scripts"
echo "6) secrets"
echo ""
echo "Autres fonctions :"
echo "7) Démarrer"
echo "8) Arréter"
echo "9) Redémarrer"
echo ""

read -p "Entrer le numéro du fichier à modifier : " choix

cd /home/homeassistant/.homeassistant

if [ $choix == 1 ];
then
sudo nano automations.yaml
elif [ $choix == 2 ];
then
sudo nano configuration.yaml
elif [ $choix == 3 ];
then
sudo nano groups.yaml
elif [ $choix == 4 ];
then
sudo nano scenes.yaml
elif [ $choix == 5 ];
then
sudo nano scripts.yaml
elif [ $choix == 6 ];
then
sudo nano secrets.yaml
elif [ $choix == 7 ];
then
sudo systemctl start home-assistant@homeassistant
elif [ $choix == 8 ];
then
sudo systemctl stop home-assistant@homeassistant
elif [ $choix == 9 ];
then
sudo systemctl restart home-assistant@homeassistant
else
echo "La saisie n'est pas correcte"
fi

Pour intégrer un nouveau module, ouvrez le fichier configuration grâce au code précédent puis ajoutez le code correspondant au module ( la liste des modules est ici ).

Sachez au’il existe différents types de « composants » Home Assistant.

Programmes aidant à l’arithmétique

Voici une liste de plusieurs fonction pouvant être utilisées pour faire de l’arithmétique :

Il sera parfois nécessaire d’appeler les fonctions entre elles pour arriver aux résultats

Tester si un entier n est premier :

def est_premier (n):
    for i in range (2,n):
        if n%i==0:
            return False
    return True

Cette fonction retourne True si le nombre est premier et False s’il ne l’est pas

Créer une liste des nombres premiers jusqu’à un entier n :

def premier (n):
    prime=[]
    for i in range (2, n+1):
        if est_premier(i)==True :
            prime.append(i)
    return prime

Cette fonction nécessite la fonction est_premier

Déterminer le plus petit diviseur d’un entier n parmi une liste de diviseurs possibles :

def plus_petit_diviseur (n, l):
    for i in range (len (l)):
        if n%l[i]==0:
            return l[i]
    return n

Décomposer un entier n en facteurs premiers :

def decomposition (n):
    prime = premier(n+1)
    D=[]
    while True:
        ppd=plus_petit_diviseur (n, prime)
        D.append(ppd)
        if n==ppd:
            return D
        else:
            n/=ppd

Cette fonction nécessite les fonctions plus_petit_diviseur, premier et est_premier

Déterminer le PGCD d’un entier N :

def pgcd(a,b):
    while b>0:
        a, b = b, a%b
    return a  

DÉTERMINER LE PPCM D’UN ENTIER N :

def ppcm (a,b):
    pgcd_ab=pgcd(a,b)
    return int((a*b)/pgcd_ab)

Cette fonction nécessite la fonction pgcd

Exemple du programme qui donne la décomposition en facteurs premiers d’un entier :

def est_premier (n):
    for i in range (2,n):
        if n%i==0:
            return False
    return True

def premier (n):
    prime=[]
    for i in range (2, n+1):
        if est_premier(i)==True :
            prime.append(i)
    return prime

def plus_petit_diviseur (n, l):
    for i in range (len (l)):
        if n%l[i]==0:
            return l[i]
    return n
     

def decomposition (n):
    prime = premier(n+1)
    D=[]
    while True:
        ppd=plus_petit_diviseur (n, prime)
        D.append(ppd)
        if n==ppd:
            return D
        else:
            n/=ppd
            

n= int(input('Entrer le nombre à décomposer : '))
print(decomposition (n))

Accéder à son Raspberry pi depuis le monde entier

Vous avez probablement installer un serveur web ou même un cloud sur votre Raspberry pi et vous voulez y accéder depuis le monde entier. Cet article vous aidera à mettre tout en place.

Si vous n’avez pas encore configuré votre cloud ça se passe ici.

Cela ne se passe pas sur votre Raspberry pi mais sur votre routeur cette fois. Je vais détailler ici les manipulations sur Freebox mais les autres box ont plus ou moins le même fonctionnement.

Connectez vous à la Freebox à l’adresse http://freebox/. Vous arrivez alors sur son interface.

La première étape consiste à rendre l’IP du Raspberry pi statique sur le réseau local. Pour cela rendez vous dans les Paramètres de la Freebox puis DHCP dans le mode avancé :

Sélectionnez Baux statiques puis ajoutez un bail statique et renseignez les champs comme ci-dessous :

Retournez maintenant dans Paramètres de la Freebox, puis Gestion des Ports dans le mode avancé. Vous arrivez sur cette fenêtre:

Appuyez sur Ajouter une redirection puis renseignez les cases comme ci-dessous :

Sauvegardez et le tour est joué.

Le port 80 est ici redirigé. Il correspond au protocole http. Mais il est également possible de rediriger d’autres ports comme le 21 pour le FTP, le 22 pour le SSH ou encore le 5900 pour VNC.

Visitez https://www.whatismyip.com/fr/ pour connaître l’IP externe de votre box. C’est avec cette IP que vous pourrez vous connectez depuis l’extérieur sur votre Raspberry pi.

Pour aller plus loin il est possible d’associer un nom de domaine à votre IP gratuitement avec noip.com.

Créer son propre cloud avec Owncloud sur Raspberry pi

Si stocker vos données dans un serveur à des milliers de kilomètres de chez vous vous fait peur, il est possible de créer son cloud à la maison avec un simple Raspberry pi.

Il vous faudra vous munir d’un Raspberry pi ( 3 ou 4 sont conseillés) avec son alimentation ainsi que d’une carte SD ( avec la dernière version de Raspbian ) d’une capacité assez importante pour stocker vos données. J’utilise personnellement une carte SD Samsung Evo+ de 64 Go qui convient parfaitement pour sa rapidité d’écriture.

C’est parti pour l’installation :

Tout d’abord faites les dernières mises à jour ça ne fait pas de mal

sudo apt-get update
sudo apt-get upgrade

Installons maintenant Apache le serveur web

sudo apt-get install apache2

Une fois installé, ouvrez une page du navigateur en tapant l’IP du Raspberry pi. La page d’accueil d’Apache devrait s’ouvrir avec écrit « It works ».

Les librairies suivantes seront nécessaires pour faire fonctionner Owncloud :

sudo apt-get install php7.3 php7.3-gd sqlite sqlite3 php7.3-sqlite php7.3-curl php7.3-zip php7.3-dom php7.3-xml php7.3-xmlrpc php7.3-intl php7.3-mbstring php7.3-mysql

Après avoir tout installé, redémarrez le Raspberry pi

sudo reboot

Passons maintenant à l’installation d’Owncloud. Pour cela téléchargez la dernière version avec :

wget https://download.owncloud.org/community/owncloud-10.4.0.zip

A l’heure où j’écrit cet article c’est la version 10.4.0 mais aller voir sur le site officiel quelle est la dernière version.

Il faut donc maintenant déplacer puis décompresser l’archive dans le dossier dédié au serveur web :

sudo mv owncloud-10.4.0.zip /var/www/html
cd /var/www/html
sudo unzip -q owncloud-10.4.0.zip

Et attribuez les droits nécessaires :

sudo mkdir /var/www/html/owncloud/data
sudo chown www-data:www-data /var/www/html/owncloud/data
sudo chmod 750 /var/www/html/owncloud/data
sudo chown -hR www-data /var/www/html/owncloud

Redémarrer encore une fois le Raspberry pi

sudo reboot now

Vous pouvez maintenant à Owncloud par votre navigateur sur le réseau local avec l’IP du rapsberry pi 192.168.X.X/owncloud

Il est alors nécessaire de créer un compte administrateur puis votre cloud est opérationnel.

Mais en restant sur le réseau local on perd un peu l’intérêt d’un cloud. Cet article vous aidera à accéder à votre Raspberry pi depuis le monde entier.

Installer linux par dessus Android

Il ne faut pas oublier qu’Android fait parti de la grande famille de Linux.

Voici une petite illustration simplifiée de la généalogie issue du site guy.pastre.org :

On comprend donc que l’on sous-exploite largement cet OS de par son origine.

La première chose à faire est de retrouver le terminal. Pour cela il faut l’application Termux. Pas besoin de rooter votre appareil , vous aurez accès à de nombreuses fonctionnalités sans être administrateur.

Une seconde application à installer est AnLinux pour installer la distribution de votre choix. Ouvrez ensuite cette application. Vous arriverez sur le Dashboard :

Appuyez alors sur Choose et sélectionnez la distribution que vous souhaitez. Je vous conseille de choisir Ubuntu, c’est pour le moment la distribution la plus aboutie sur Android. Pour ceux qui sont intéressés par Kali, Parrot ou Black Arch je vous conseille de vous diriger vers mon autre article.

Appuyez ensuite sur Copy puis Launch. Collez ensuite la commande dans Termux en restant appuyer n’importe où sur le terminal. Lancez avec entrer et Linux s’installe.

Démarrer maintenant Linux en entrant ./start-ubuntu.sh (ou ./start-« l’os installé ».sh) .Et si cela ne fonctionne pas utilisez plutôt la commande bash start-ubuntu.sh .

Retourner ensuite dans AnLinux pour installer l’interface graphique. Dirigez vous vers le menu Setup Desktop. Sélectionnez la distribution et l’interface que vous souhaitez. Xfce est recommandé pour les petits écrans mais vous pouvez choisir celle qui vous est la plus familière (personnellement j’utilise mate et je n’ai aucun problème avec). Appuyez sur Copy puis coller dans Termux la command.

Lors de l’installation il vous demandera un mot de passe pour la connexion à VNC.

Une fois l’installation terminée lancez la commande vncserver-start puis rendez vous dans l’application VNC Viewer. Créez une nouvelle connexion en appuyant sur + puis renseignez en adresse localhost:1 .

Si vous obtenez cette erreur :

Arrêter le serveur puis relancer le avec:

vncserver-stop && vncserver-start

Vous pouvez maintenant vous amuser en installant vos programmes favoris.