La conjecture de Koninck en java

Fermé
roro46 - Modifié le 17 nov. 2022 à 04:28
 PierrotLeFou - 31 déc. 2022 à 15:13

Bonjour,

je dois créé un programme qui prouve que la somme des diviseurs est égale au produit des diviseurs à la 2. En gros, je dois prouver ça: S(n)=P(n)^2. Ça devrait marcher qu'avec le chiffre 1 et le nombre 1782. Le problème c'est que je ne sais pas par où commencer. Je viens de crée mes méthodes, mais même ça je ne sais pas si c'est bon. (je suis débutante en java).


Macintosh / Safari 15.3

6 réponses

PierrotLeFou
17 nov. 2022 à 05:22

Sans vouloir te contredire, la somme des diviseurs est égale au produit des facteurs "premiers" au carré pour cette conjecture.
Puisque tu débutes en Java (en programmation?), c'est plus compliqué de t'aider.
À partir de la liste des facteurs premiers avec l'exposant pour chacun, on peut retrouver la liste des diviseurs.
Mais ça demande des techniques combinatoires spéciales.
On peut le faire de façon séparée pour les deux.
Sais-tu comment savoir si un nombre en divise un autre? Le reste de la division (modulo = %) doit être 0.
Pour la liste des diviseurs, on essaie de diviser le nombre par tous les nombres entre 2 et sa racine carrée incluse.
Si d est un diviseur de n, alors n/d en sera un également.
Donc, tu places dans une liste ces paires. Attention aux carrés parfaits comme 25. Il ne faut pas compter 5 deux fois.
Pour les facteurs premiers, on essaie de diviser tant qu'on peut le nombre par tous les nombres inférieurs à la racine du nombre résultant.
Je veux dire ceci:
Si j'ai 12, j'essaie de le diviser par 2 tant que je peux: 12/2 = 6 / 2 = 3, qui ne se divise pas par 2.
Ensuite je passe au facteur suivant qui sera 3 ici. Mais si f=3 et n=3, f*f > n, donc j'ai fini.
À la fin, si le nombre restant n'est pas 1, ce nombre est un facteur premier.
Pour les diviseurs, je verrais deux boucles for imbriquées. Mais pour les facteurs premiers, au moins la boucle intérieure sera une boucle while.

0

Non, tu ne m'as pas contredit :). Tu as raison, c'est moi je me suis mal exprimée. J'ai compris la plupart de ce que tu m'as expliquée, par contre je ne sais pas comment tout mettre cela en codage. Tout ce qui est modulo etc. je comprend. Jusqu'à maintenant j'ai fait cela. Je sais qu'il y a des trucs qu'il ne sont pas bon, mais je ne sais pas comment compléter le codage.

0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
17 nov. 2022 à 07:35

Bonjour 

pour poster ton code, merci de faire comme décrit là 

https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code


0
package tp3;

import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Koninck {
	public static boolean nbPremier(int n) {
		boolean nbPremier = true;
		if (n < 0) {
			nbPremier = false;
		} else if (n != 0 && n != 1) {
			for (int i = 2; i <= n/2; i++) {
				if (n != i && n % i == 0) {
					nbPremier = false;
					break;
				}
			}
		}
		return nbPremier;
	}
	public static ArrayList<Integer> divisor (int n){ 
		// les diviseurs de n seront affichés
		ArrayList<Integer> listeDiv = new ArrayList<Integer>();
		for (int i=1; i<=n;i++){	  
			for (int j=1;j<=n;j++){
				if (i*j==n){
					JOptionPane.showMessageDialog(null, listeDiv);
					listeDiv.add(i);
				}
			}
		}
		return listeDiv;
	}
	public static int P(int n) {
		ArrayList<Integer> listeDiv = new ArrayList<Integer>();
		if (listeDiv.add(n)) {
		}
		return n;
	}
	public static int S(int[] tab) {
		int n = Integer.parseInt(Koninck.divisor(n));
		int somme = 0; 
		for(int i=n; i<tab.length;i++){
	        somme += tab[i];
	      }
	      return somme;
	    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = Integer.parseInt(JOptionPane.showInputDialog
				("Veuillez entrer un nombre."));
		Koninck.divisor(n);
	}
}               
0
PierrotLeFou
17 nov. 2022 à 14:56

En fait, tu n'as besoin que de deux fonctions, une qui fait la somme des diviseurs au fur et à mesure qu'elle les trouve.
Et une qui fait le produit des facteurs premiers de la même façon.
Tu n'auras même pas besoin de ArrayList
Informes-toi sur math.sqrt pour la limite des diviseurs et des facteurs.

0
PierrotLeFou
18 nov. 2022 à 02:10

Je te donne la fonction qui calcule le produit des facteurs premiers. C'est écrit en C et non en Java. Ça devrait être facile à convertir.
(je n'ai pas coloré mon code car je suis aveugle et ma synthèse vocale ne me donne pas accès aux boutons)
int facteurs(int nombre) {
    int produit = 1;
    int f = 2;
    while(f*f <= nombre) {
        int compte = 0;
        while(nombre % f == 0) {
            nombre = nombre / f;
            compte++;
        }
        if(compte > 0) {
            produit *= f;
        }
        f++;
    }
    return produit * nombre;
}

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lumberjack33 Messages postés 8 Date d'inscription samedi 31 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022
31 déc. 2022 à 12:45

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    System.out.print("Entrez un nombre entier: ");
    int n = sc.nextInt(); // l'utilisateur entre le nombre entier n

    // trouvez tous les diviseurs de n
    ArrayList<Integer> diviseurs = new ArrayList<>();
    for (int i = 1; i <= n; i++) {
      if (n % i == 0) {
        diviseurs.add(i);
      }
    }

    // calculez la somme des diviseurs
    int somme = 0;
    for (int diviseur : diviseurs) {
      somme += diviseur;
    }

    // calculez le produit des diviseurs à la puissance de 2
    int produit = 1;
    for (int diviseur : diviseurs) {
      produit *= diviseur * diviseur;
    }

    // vérifiez si la somme des diviseurs est égale au produit des diviseurs à la puissance de 2
    if (somme == produit) {
      System.out.println("La somme des diviseurs est égale au produit des diviseurs à la puissance de 2");
    } else {
      System.out.println("La somme des diviseurs n'est pas égale au produit des diviseurs à la puissance de 2");
    }
  }
}
 

Ce programme parcourt tous les nombres de 1 à n et vérifie s'ils sont des diviseurs de n. Si c'est le cas, ils sont ajoutés à la liste des diviseurs. Ensuite, le programme calcule la somme des diviseurs et le produit des diviseurs à la puissance de 2, et vérifie si ces deux valeurs sont égales. Si elles le sont, le programme affiche un message indiquant que la somme des diviseurs est égale au produit des diviseurs à la puissance de 2. Dans le cas contraire, il affiche un message indiquant qu'elles ne sont pas égales.

0
PierrotLeFou
31 déc. 2022 à 15:13

@Lumberjack33:
Comme je l'ai dit, la conjecture parle du produit des facteurs premiers et non du produit des diviseurs.
Pour ce qui est de trouver tous les diviseurs, on peut s'arrêter à la racine carrée du nombre, car si d est un diviseur de n, alors n/d l'est aussi.
Si on veut garder l'ordre, à la fin on peut parcourir le tableau à l'envers et faire des add de n/d.
Attention aux carrés parfaits comme 25 qui n'auront que 3 diviseurs: 1, 5, 25 et non 1, 5, 5, 25

0