2013-08-08 4 views
1

저는 몇 시간 동안이 문제를 해결하기 위해 노력해 왔지만, 어디에서 시작하거나 무엇을해야할지 모르겠습니다. 내가 배후에있는 수학/논리를 이해하지만, 코드에 아주 잘 넣을지는 모른다. 어떻게 파이썬에서 루프를 사용하고 다른 함수를 호출하여 두 다항식을 곱할 수 있습니까?

문제입니다 :

  1. 쓰기 및 다중 기능 (자체, 다른) 두 다항식의 제품을 반환을 테스트합니다. 하나의 루프를 사용하십시오 (for 또는 for); 그 안에는 이전 질문에서 * multiply_by_one_term *이 (가) 호출됩니다.

이것은 내가 처음에 설정 한 것입니다, 나는 그것이라고 무엇을 불러올 수 없습니다

def multiply(self, other): 
    """ 
     >>> p1 = Polynomial([1, 2]) 
     >>> p2 = Polynomial([3, 4]) 
     >>> p1.multiply(p2).coeffs 
     [3, 10, 8] 
    """ 

이는 다음과 같습니다

class Polynomial: 
    def __init__(self, coeffs=[0]): 
     self.coeffs = coeffs 

이 내가 만든 테스트입니다 전화해야하는 기능 :

def multiply_by_one_term(self, a, exp): 
    """  
     >>> p = Polynomial([2, 1, 3]) 
     >>> p.multiply_by_one_term(3, 2).coeffs 
     [6, 3, 9, 0, 0] 
     >>> p = Polynomial([2, 1, 3]) 
     >>> p.multiply_by_one_term(3, 0).coeffs 
     [6, 3, 9] 
    """ 

    return Polynomial([a*i for i in self.coeffs] + [0]*exp) 

나는 이걸 도와 줄 수 있어요. 나는 프로그래밍에 관해서는 여전히 멍청하다. 잘 모르겠다.

답변

4

수학적으로, 우리가 최종적으로 갖게 될 계수의 양 (또는 지수)은 첫 번째 다항식의 지수와 두 번째 지수의 지수의 곱이어야합니다. 그래서 우리는 그 많은 0의 목록을 생성합니다. 이제 첫 번째 다항식의 계수를 반복합니다. 여기서 우리는 현재 어떤 색인을 가지고 있는지 추적하기 위해 열거 형을 사용하고 있습니다. 이것은 물론 각 숫자의 지수가 지수와 같다고 가정합니다. 따라서 항목 2의 숫자는 x^2보다 앞에 있습니다.

다항식 1의 각 계수에 대해 우리는 다항식 2의 모든 계수를 순환합니다 (다항식 2의 모든 계수는 다항식 1의 모든 계수와 곱해야 함). 그 결과 얻은 힘은 인덱스의 추가가되며, 이는 final_coeffs[ind1 + ind2] += coef1 * coef2으로 처리됩니다. 그런 다음 남은 것은 새로운 다항식 객체를 반환하는 것입니다.

여기서 p1과 p2가 두 개의 다항식 객체라는 것을 알 수 있습니다.

def multiply(p1, p2): 
    final_coeffs = [0] * (len(p2.coeffs)+len(p1.coeffs)-1) 
    for ind1, coef1 in enumerate(p1.coeffs): 
     for ind2, coef2 in enumerate(p2.coeffs): 
      final_coeffs[ind1 + ind2] += coef1 * coef2 
    return Polynomial(final_coeffs) 
+1

해줘서 고맙습니다. 방금 시도한 결과 끝에 0이 추가되었습니다. – confusedstudent

+0

@parmvirchahal 죄송합니다. 현재 Python을 사용하는 장치가 아니므로 게시 된 코드는 테스트되지 않았습니다. 어느 쪽 끝이 제로 (오른쪽 또는 왼쪽)입니까? – scohe001

+0

아, 네 말이 맞아, 그건 내 멍청한 실수 야. +1, 좋은 캐치. 이것은 간단한 수정으로, final_coeffs 목록을 만들 때 빼기를 추가하는 것을 잊어 버렸습니다. – scohe001

1

특정 제약으로 인해 할당이라고 가정합니다.

I이었다 훨씬 이런 합 배운 곱셈의 방법

의 모든 결과를 추가로

(x+2)(3x+4) = (x+2)(3x)+(x+2)4 

이 변환 쉽게 :

다항식에 대한
12*34 = 12*30+12*4 

, 우리는이로 변환을

p1.multiply_by_one_term(p2.coeffs[i], len(p2.coeffs[i])-i-1) 

즉,

이 필요합니다.
# WARNING: This is not very idiomatic Python, but I can't think of a way to do it without indexes. 
def multiply(self, other): 
    subproducts = [] 
    for i in len(other.coeffs): 
     subproducts.append(self.multiply_by_one_term(other.coeffs[i], len(other.coeffs)-i-1)) 
    add_subproducts_together(subproducts) 

하위 제품을 함께 추가하는 쉬운 방법이 있어야합니다. 그렇지 않은 경우 비슷한 용어를 각각 추가하여 작성할 수 있습니다 (오른쪽에서 정렬해야 함을 기억하십시오).