2012-11-04 11 views
7

Ho appena iniziato a imparare Python e ho iniziato a fare alcuni problemi solo per aiutare a costruire le mie abilità, tuttavia sono abbastanza bloccato su questa domanda.Elenco di numeri i cui quadrati sono la somma di due quadrati

Creare un elenco contenente tutti gli interi positivi fino a 1000 i cui quadrati possono essere espressi come somma di due quadrati, (i, e., Numeri interi p per cui p^2 = m^2 + n^2, dove m e n sono numeri interi maggiori di 0.)

Suggerimenti: ci sono diversi approcci. Potresti trovare utile avere un elenco di tutti i numeri quadrati. L'operatore in potrebbe essere utile.

Ecco il codice che mi è venuta in mente finora:

numbers=xrange(1001) 
    numbers_squared=[x**2 for x in numbers] 
    a=[] 

    for x in numbers_squared: 
     for b in numbers_squared: 
      if (x+b)**.5 <= 1001: 
       a.append(x+b) 
    print a 

Il problema che ottengo con questo è che Python vogliono anni per fare questi calcoli (ho aspettato circa dieci minuti ed è ancora numeri di stampa). Qualsiasi suggerimento su come risolvere questo sarebbe molto apprezzato.

p.s. Il punto principale è usare le liste. Anche i suggerimenti sarebbero più apprezzati della soluzione stessa.

Grazie!

+0

Bene, per esempio, è possibile limitare il secondo per il ciclo ai numeri sotto x. '8 ** 2 = 64' per esempio non può essere espresso come la somma di qualsiasi numero maggiore di' 64'. –

+0

Ti è stato dato il numero di tali numeri? – inspectorG4dget

+0

Ci stavo pensando, ma non ero sicuro di come scrivere esattamente in Python. Grazie per il suggerimento: D – Dizzle

risposta

2

come su una lista di comprensione? calcolare per c nella gamma (1,1011) per B nella gamma (1, c) per una nella gamma (1, b)

come segue:

x = [(a,b,c) for c in range(1,1001) for b in range(1, c) for a in range(1,b) if a**2+b**2==c**2] 
print x 

ho cronometrato questo e ci vogliono 46 secondi per completare sul mio computer

7

Prima di tutto, non stai risolvendo il problema. Devi fare un controllo per assicurarti che (x+b)**.5 sia effettivamente un numero intero. In secondo luogo, se si stampano numeri, si sono già calcolati tutti i numeri. Fare quanto sopra ridurrà il tempo richiesto per questo passaggio.

+0

Ahh okay. Grazie mille: D, penso di averlo rotto !! – Dizzle

+0

Questo è fondamentalmente un problema di trovare triplette Pythagrean. Basta mantenere il 'c' in' a ** 2 + b ** 2 = c ** 2'. – Droogans

1

Questo potrebbe funzionare:

def isSumOfSquares(n): 
    """return True if n can be expressed as the sum of two squares; False otherwise""" 

    for a in xrange(1,n): 
     b = n-(a**2) 
     if b<=0: 
      return False 
     elif not math.sqrt(b)%1: 
      return True 
    return False 

answer = [i for i in xrange(1,1001) if isSumOfSquares(i**2)] 

Fatemi sapere se questo funziona per voi

+0

Ho provato e non ha funzionato, ho provato a fare alcune modifiche da correggere e ancora no. Grazie comunque :) – Dizzle

+0

L'ho eseguito e ottenuto 567 voci in [1, 1000].Se potessi essere più specifico su cosa non funziona, potrei provare a risolverlo – inspectorG4dget

0

Ho appena answered this altrove!

import math 

def is_triple(hypotenuse): 
    """return (a, b, c) if Pythagrean Triple, else None""" 
    if hypotenuse < 4: 
     return None 

    c = hypotenuse ** 2 

    for a in xrange(3, hypotenuse): 
     b = math.sqrt(c - (a ** 2)) 
     if b == int(b): 
      return a, int(b), hypotenuse 

    return None 

>>> results = [x for x in range(1001) if is_triple(x)] 
>>> len(results) 
567 

Corre quasi all'istante.

+0

Sono molto impressionato dalla velocità della tua implementazione, tuttavia ottieni solo un ipotenusa di soluzione pr, e quindi la tua lista finale è più piccola di quella completa insieme di soluzioni perché per c = 25 ci sono due soluzioni: (15, 20, 25) e (7, 24, 25), la len della mia lista di comprensione è 881 perché contiene tutte 'soluzioni uniche dove a jcr

+1

Il titolo dell'OP è un po 'fuorviante: * Elenco di numeri i cui quadrati sono la somma di due quadrati * rispetto a ciò che ho letto: * Elenco di numeri il cui quadrato ** è * * la somma di due quadrati * – Droogans