IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

[Problème] x^2+y^2=1 et décimaux


Sujet :

Mathématiques

  1. #21
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    hummm... pas si facile que ça à mon avis, c'est jamais très bon de travailler avec des sommes pour un test de primalité...

    Et il reste par ailleurs l'unicité des solutions trouvées...
    Ca c'est toi qui nous l'a posé comme axiome dans le PO.

    2 remarques de détail:
    - il faut prendre les valeurs absolues des cos(nt) et sin(nt)
    Yes, of course.

    - il faut un algo qui calcule avec une précision arbitraire les cos, sin et arcos, style Cordic.
    Pour le coup, le triangle de pascal est aussi une bonne solution: juste une somme de k * (3/5)^i * (4/5)^j
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  2. #22
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Pour le coup, le triangle de pascal est aussi une bonne solution: juste une somme de k * (3/5)^i * (4/5)^j
    euhh... ça converge pas très vite ça
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  3. #23
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    euhh... ça converge pas très vite ça
    quel convergence... c'est une formule exacte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                     n
    X = (a+ib)^n = Somme {  p[n,k].(a)^(n-k).(ib)^(k) }
                    k=0
    avec
    p[n,k] = coef ligne=n colonne=k du triangle de Pascal
    a=cos(t)=3/5
    b=sin(t)=4/5
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #24
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    quel convergence... c'est une formule exacte.
    oui, t'as raison bien sûr, mais je parlais d'un algo général de calcul de cos(x) ! Mais c'est vrai qu'on peut utiliser Pascal, par exemple pour les termes pairs

    cos(2nt) = 5^(-2n)*[somme_{i de 0 à n} C(2n,2i)*3^(2i)*4^(2n-2i) ]

    ... mais si tu veux calculer ça pour n=100 t'as intérêt d'avoir une précision idoine!

    (PS: et je ne vois pas comment obtenir avec ça la primalité de cos(nt) et sin(nt)...)
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  5. #25
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    ... mais si tu veux calculer ça pour n=100 t'as intérêt d'avoir une précision idoine!
    La classe BigDecimal de Java...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    TP(2)=(28,96,100)
    TP(3)=(936,352,1000)
    TP(4)=(8432,5376,10000)
    TP(5)=(99712,7584,100000)
    TP(6)=(752192,658944,1000000)
    TP(7)=(9784704,2063872,10000000)
    TP(8)=(42197248,90660864,100000000)
    TP(9)=(472103424,881543168,1000000000)
    TP(10)=(9884965888,1512431616,10000000000)
    TP(11)=(71409248256,70005137408,100000000000)
    TP(12)=(131585609728,991304810496,1000000000000)
    TP(13)=(8719952142336,4895143985152,10000000000000)
    TP(14)=(91480864735232,40388753227776,100000000000000)
    TP(15)=(225775162589184,974179437248512,1000000000000000)
    TP(16)=(6438784522452992,7651277924204544,10000000000000000)
    TP(17)=(99842930528354304,5602608634396672,100000000000000000)
    TP(18)=(554236714094952448,832359096033214464,1000000000000000000)
    TP(19)=(3333452483696001024,9428048288958906368,10000000000000000000)
    TP(20)=(95425101213847257088,29900669864185430016,100000000000000000000)
    TP(21)=(811755966196566982656,583996790525665476608,1000000000000000000000)
    TP(22)=(9998028472726528720896,198561472974078083072,10000000000000000000000)
    TP(23)=(78792858943967761268736,61576662620151796989952,100000000000000000000000)
    TP(24)=(965370454625020943532032,260882895830831308210176,1000000000000000000000000)
    TP(25)=(3705159561103475195510784,9288261011985155397517312,10000000000000000000000000)
    TP(26)=(52075130729260392007073792,85370842560738733949190144,100000000000000000000000000)
    TP(27)=(995417524861472223635963904,95624009530349267638550528,1000000000000000000000000000)
    TP(28)=(6737497225411627482924187648,7389596141709682183256408064,10000000000000000000000000000)
    TP(29)=(18691785781207692568506138624,98237554653551112962931949568,100000000000000000000000000000)
    TP(30)=(898051151915655059114492428288,439891041671645137229542588416,1000000000000000000000000000000)
    TP(31)=(8907435244867091452523295277056,4545062965295369649538683895808,10000000000000000000000000000000)
    TP(32)=(17084107746839591518830300495872,98529859750708949517418465591296,100000000000000000000000000000000)
    TP(33)=(685734231524634047026365921755136,727852020478970429255153197514752,1000000000000000000000000000000000)
    TP(34)=(9937221552979567716199421110648832,1118761729323249800680008188952576,10000000000000000000000000000000000)
    TP(35)=(50673235483291407891756461152272384,86210342799776040533675418018906112,100000000000000000000000000000000000)
    TP(36)=(385643329498459876918864577237614592,922647940664987506336104197331615744,1000000000000000000000000000000000000)
    TP(37)=(9695043502310659312202021042078613504,2450741008002246022665708566088777728,10000000000000000000000000000000000000)
    TP(38)=(77776189077881924054537794781181902848,62855901970471798361621916940096241664,100000000000000000000000000000000000000)
    TP(39)=(999344924445886182606033859890032672768,36190081296482842565748566833678516224,1000000000000000000000000000000000000000)
    TP(40)=(8211899883345986516242762280122332479488,5706548896303454355110214624670767906816,10000000000000000000000000000000000000000)
    TP(41)=(94923790470503553938338290678100138131456,31455905688947165999280810492954052395008,100000000000000000000000000000000000000000)
    TP(42)=(317895497311443995635783260124968409628672,948125757897711427502391188382525419421696,1000000000000000000000000000000000000000000)
    TP(43)=(5677633079313027446204429946310392897601536,8231918525877820530100613211294899793559552,10000000000000000000000000000000000000000000)
    TP(44)=(99921146682900728918031485368221555734085632,3970446520762703610968239697286255580545024,100000000000000000000000000000000000000000000)
    TP(45)=(631290452263506002395934829787619379048873984,775546494338629609678442444762054912389414912,1000000000000000000000000000000000000000000000)
    TP(46)=(2416629241128000863051930579370723024822075392,9703602584139825677238133306873284506727481344,10000000000000000000000000000000000000000000000)
    TP(47)=(92128596119886610596216649931210614202752303104,38888581575814947159013355206273922841788284928,100000000000000000000000000000000000000000000000)
    TP(48)=(863880229325839240849406741237455067950820098048,503697279504203201815653068212041376571288715264,1000000000000000000000000000000000000000000000000)
    TP(49)=(1153703139921409830571215901728399395134610866176,9933225511631933137689172339171888803034293075968,10000000000000000000000000000000000000000000000000)
    TP(50)=(72543585253527006118086083303004714053466679410688,68828978189162877470704761248858527979282645385216,100000000000000000000000000000000000000000000000000)
    duration: 94ms (qui a dit Java c'est lent ?)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #26
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    et mon TP(100) ???
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  7. #27
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    et mon TP(100) ???
    TP(100)=(
    9986201694357376110212332562320175422263914688886146690990020359381748917381657796123612571255177216,
    525143522871481801043476948034529545551568381122441388993736608257792639594195547338576197937266688,
    10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 )

    duration: 172ms

    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #28
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Merci les Bigdecimal Java!!

    Dès que j'ai un moment je regarde en Haskell...
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  9. #29
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Le code java, pour faire les comparaisons...

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    import java.math.BigDecimal;
    import java.math.BigInteger;
     
    public class DvpThread433050 {
     
    	// current rank
    	static int rank=1;
     
    	// actual line of the Pascal's Triangle
    	static BigInteger[] pascal = new BigInteger[]{BigInteger.ONE,BigInteger.ONE};
     
    	// compute next line of the Pascal's Triangle
    	public static void nextpascal() {
    		BigInteger[] nextline = new BigInteger[pascal.length+1];
    		nextline[0]=BigInteger.ONE;
    		for(int i=1;i<(nextline.length-1);i++) {
    			nextline[i]=pascal[i-1].add(pascal[i]);
    		}
    		nextline[nextline.length-1]=BigInteger.ONE;
    		pascal=nextline;
    	}
     
    	// compute cos(nt) and sin(nt) using De Moivre and Pascal
    	public static BigDecimal[] cos_sin_nt() {
    		BigDecimal cost = BigDecimal.valueOf(3.0/5.0);
    		BigDecimal sint = BigDecimal.valueOf(4.0/5.0);
     
    		// cos(nt)+i.sin(nt) = (cos(t)+i.sin(t))^n = X
     
    		// Cos(nt) = Real part of X
    		// Sin(nt) = Imaginary part of X
     
    		//                  n
    		// X = (c+i.s)^n = Sum pascal(k).(c)^(n-k).(i.s)^(k)
    		//                 k=0
     
    		BigDecimal real=BigDecimal.ZERO;
    		BigDecimal imag=BigDecimal.ZERO;
    		for(int i=0;i<pascal.length;i++) {
     
    			BigDecimal P = new BigDecimal(pascal[i]);
    			BigDecimal coef = P.multiply(cost.pow(rank-i)).multiply(sint.pow(i));
     
    			if (i%2==0) {
    				int k=i/2;
    				if (k%2==0) real=real.add(coef); else real=real.subtract(coef);
    			} else {
    				int k=(i-1)/2;
    				if (k%2==0) imag=imag.add(coef); else imag=imag.subtract(coef);
    			}
    		}
     
    		return new BigDecimal[] {real,imag};
    	}
     
    	// compute next triplet
    	public static BigInteger[] nextTP() {
    		// compute next pascal line
    		rank++;
    		nextpascal();
     
    		// compute cos(nt) and sin(nt)
    		BigDecimal[] cs = cos_sin_nt();
    		BigDecimal cosnt=cs[0];
    		BigDecimal sinnt=cs[1];
     
    		// apply formula TP=(cos(nt).10^n,sin(nt).10^n,10^n)
     
    		BigDecimal POW10=BigDecimal.valueOf(10).pow(rank);
    		BigInteger a = cosnt.multiply(POW10).toBigInteger().abs();
    		BigInteger b = sinnt.multiply(POW10).toBigInteger().abs();
     
    		// cosmetic: sort by number of digits
    		if (a.toString().length()<b.toString().length()) {BigInteger swap=a; a=b; b=swap;}
     
    		return new BigInteger[] {a,b,POW10.toBigInteger()};
    	}
     
     
    	public static void main(String[] args) {
    		long l0 = System.currentTimeMillis();
    		for(int i=1;i<100;i++) {
    			BigInteger[] tp = nextTP();
    			System.out.println("TP("+rank+")=("+tp[0]+","+tp[1]+","+tp[2]+")");
    		}
    		long l1 = System.currentTimeMillis();
     
    		System.out.println("duration: "+(l1-l0)+"ms");
    	}
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #30
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    pour la primalité, j'ai l'impression qu'on peut s'en tirer à bon marché avec des formules de trigo.
    par exemple si cosx =p/5 avec p premier avec 5
    peut on avoir aussi cos2x =q/5 ???
    Pour voir que non il suffit d'utiliser la formule:
    co2x=2cosx^2-1
    on arriverait à
    q/5= 2p^2/25-1
    qui amène une relation 2p^2 multiple de 5 contradiction
    Pour cos3x il suffit d'utiliser cette fois
    cos3x=cosx(1-2cos2x)
    et ainsi de suite....
    Les tp donnés par Pseudocode pour les puissances de 5 sont tous bien des tpp.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  11. #31
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Yes... on est les meilleurs !!!!




    PS: au fait Nemerle, pourquoi on fait tout ca ? Si c'est pour un exo, sache qu'on ne fait pas les exos des autres.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  12. #32
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    @Pseudocode, tu peux encore améliorer ton (real)code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BigDecimal coef = P.multiply(cost.pow(rank-i)).multiply(sint.pow(i));
    à chaque fois que tu calcules un terme du développement tu multiplies une puissance par une autre bref tu te paies rank-1 multiplications.
    Alors qu'en fait pour passer de a^n à a^(n-1)b il suffit de diviser par a et de multiplier par b et ainsi de suite de proche en proche en proche jusqu'à b^n.
    Ou alors mieux, si tu veux éviter les divisions, tu construis une liste
    [1, a, a^2, ...a^n] en itérant donc n-1 mult pour cette liste
    autant pour
    [1,b,b^2,.....b^n]
    Après il te suffit de constituer tes produits en marriant correctement les termes de la première liste avec ceux de la seconde donc n+1 mult
    au total 3n-1 produits (sans compter les coefficients binomiaux)
    Avec ta méthode ton algo est en n^2
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  13. #33
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    je peux meme encore optimiser en utilisant uniquement des entiers. Il suffit de tout multiplier par 5^n.

    cos(t)=3/5
    sin(t)=4/5
    X=(cos(t)+i.sin(t))^n
    X=( (3/5) + i.(4/5) )^n
    X = (5^(-n)).( 3 + i.4 )^n

    X = (5^(-n)).S, avec S = ( 3 + i.4 )^n

    et donc

    Triplet = ( 10^n.Real(X), 10^n.Imag(X), 10^n )
    Triplet = ( 2^n.Real(S), 2^n.Imag(S), 10^n )


    Edit: cool... je passe de 150ms a 100ms pour le calcul de TP(100)
    mais bon... je suis pas a quelques millisecondes près.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  14. #34
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Jedai, help, je ne maitrise pas encore assez haskell pour pondre un code performant... je suis loin des perfs de pseudocode --> BTW, c'était pour mon bô-père, prof au collège
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  15. #35
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Bon, Data.Complex ne prend pas des entiers comme constituantes malheureusement (ça poserait des problèmes pour certaines opérations sur les complexes), donc j'ai bricolé un petit truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import Control.Arrow
     
    data IComplex = !Integer :+ !Integer
                    deriving (Show, Eq)
     
    re (x :+ _) = x
    im (_ :+ y) = y
     
    (x:+y) <*> (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
     
    pairs = zipWith (\p2n->dup ((p2n *).abs) . (re &&& im)) p2 s
        where 
          dup f = f *** f
          s = iterate (<*> (3 :+ 4)) (1 :+ 0)
          p2 = iterate (* 2) 1
     
    main = print $ pairs !! 100
    En mode interprété, pairs !! 1000 prend dans les 20ms...

    --
    Jedaï

  16. #36
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    L'interprète python ne se défend pas trop mal non plus
    16 ms pour effectuer ce calcul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import datetime
     
    class intcomplex:
        def __init__(self, x,y):
            self.x=x
            self.y=y
        def __str__(self):
            return "(%d,%d)"%(self.x,self.y)
        def prod(self,other):
            X=self.x*other.x-self.y*other.y
            Y=self.x*other.y+self.y*other.x
            return intcomplex(X,Y)
        def intpow(self,n):
            R=intcomplex(1,0)
            for i in range(0,n):
                R=R.prod(self)
            return R
     
    z=intcomplex(3,4)
    print datetime.datetime.now()
    z=z.intpow(1000)
    print datetime.datetime.now()
    print z
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  17. #37
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Ah... je vois que tout le monde a utilisé la multiplication complexe plutot que la formule de De Moivre. Effectivement c'est plus rapide que mon triangle de pascal

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public static BigInteger[] computeTP(int n) {
    	// with cos(t)=3/5, sin(t)=4/5 compute X
    	// X = 10^n.(cos(nt)+i.sin(nt))
    	//   = 10^n.(cos(t)+i.sin(t))^n
    	//   = 10^n.5^(-n).(3+i.4)^n
    	//   = 2^n.(3+i.4)^n
     
    	// compute (3+i.4)^n
    	BigInteger THREE = BigInteger.valueOf(3);
    	BigInteger FOUR  = BigInteger.valueOf(4);
    	BigInteger real = BigInteger.ONE;
    	BigInteger imag = BigInteger.ZERO;
    	for(int i=0;i<n;i++) {
    		BigInteger realnext=real.multiply(THREE).subtract(imag.multiply(FOUR));
    		BigInteger imagnext=real.multiply(FOUR).add(imag.multiply(THREE));
    		real=realnext;
    		imag=imagnext;
    	}
     
    	// multiply by 2^n
    	BigInteger POW2=BigInteger.valueOf(2).pow(n);
    	BigInteger a = real.multiply(POW2);
    	BigInteger b = imag.multiply(POW2);
     
    	// return TP
    	BigInteger POW10=BigInteger.valueOf(10).pow(n);
    	return new BigInteger[] {a.abs(),b.abs(),POW10};
    }
     
    public static void main(String[] args) {
    	long l0 = System.currentTimeMillis();
    	BigInteger[] tp = computeTP(1000);
    	long l1 = System.currentTimeMillis();
    	System.out.println("TP(1000)=("+tp[0]+","+tp[1]+","+tp[2]+")");
    	System.out.println("duration: "+(l1-l0)+"ms");
    }

    TP(1000) en 31ms
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  18. #38
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    'tain, c'est la guerre!!!
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  19. #39
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Voyons, pour TP(10000) :
    Haskell : 190ms
    Python : 422ms
    Java : 750ms

    Notez que nos méthodes ne sont pas très adaptées au calcul d'un TP en particulier, elles pourraient faire beaucoup mieux avec une simple exponentiation rapide.

    --
    Jedaï

  20. #40
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par Jedai Voir le message

    pairs = zipWith (\p2n->dup ((p2n *).abs) . (re &&& im)) p2 s
    where
    dup f = f *** f
    s = iterate (<*> (3 :+ 4)) (1 :+ 0)
    p2 = iterate (* 2) 1
    Jedai, ça serait mieux dans le forum idoine, mais des explications sur la construction de pairs me ferait plaisir (en particulier ***, &&& et dup...)
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/02/2008, 15h53
  2. problème avec les nombres décimaux
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2008, 11h09
  3. Problème avec le format des décimaux
    Par layouni dans le forum Framework .NET
    Réponses: 1
    Dernier message: 14/02/2007, 14h43
  4. [SQL 2005] problèmes de gestion des chiffres décimaux
    Par skystef dans le forum Accès aux données
    Réponses: 1
    Dernier message: 10/01/2007, 12h40
  5. Problème nombre décimaux
    Par salut12345 dans le forum C++
    Réponses: 3
    Dernier message: 29/10/2005, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo