素因子分解的python实现

问题:给定一个正整数,求解其素因子分解式。

素因子分解适合于以递归的方式处理:给定一个数N,首先找到将它分解为两个较小的数的乘积(姑且称之为二因子分解):N=N1*N2。然后进一步对N1和N2分别对其进行二因子分解,直到最后得到所有素因子为止。

在递归调用的过程中,要解决如何将得到的素因子保留下来。这里事实上涉及到两个问题:(1)如何将子函数调用内部的运算结果带回调用处;(2)用什么数据结构来存储结果。

Python的list对象类型非常适合于本问题的解决,一方面,list可以方便地在其尾部追加元素(list.append),而不需要事先确定其存储长度;另一方面,list是属于所谓的mutable object,在子函数中对从函数接口处传入的list object的元素内容的改变自然地被带回到上层。这类似于C/C++中函数接口中的指针参数所实现的pass-by-reference,虽然指针本身不允许子函数修改(修改了也不会被带回调用处),但是指针所指向的存储区的内容是可以改变的。

 

# This function performs factorization over N in recursive way.
# The result factors are stored in 'q_factor'.
# If N is a prime number, then return True; otherwise return False.
def factor(N, q_factor=None):
    if q_factor is None:
        q_factor = [];

    isPrime = True; # Initialize isPrime to False.
    
    for x in range(2, N):
        if N % x == 0:
            factor1 = x;
            factor2 = N//x; #Note: If '/' is used, factor2 will be taken as float and causes error.
            print(N, 'equals', factor1, '*', factor2);
            print('Further factorization over',factor1);
            factor(factor1, q_factor);
            print('Further factorization over',factor2);
            factor(factor2, q_factor);
            isPrime = False
            break
    # loop fail through without finding a factor,
    # which means that N is a prime number.    
    if isPrime is True:
        print(N, 'is a prime number');
        q_factor.append(N);

    return isPrime;

 

#! /usr/bin/env python3.3

from mylib import factor # 'factor()' is defined in 'mylib' module.

# int() is used for string to int conversion.
N = int(input("Please input a positive integer for factorization(>=2):"))

if N<2:
    print("N shall be not less than 2");
    exit

q_factor=[]
isPrime = factor(N,q_factor)    
    
if isPrime is False:
    print(N, " is factorized into:", q_factor)
else:
    print(N, " is a prime number by itself!")

 

以下是运行结果例:

>>> ================================ RESTART ================================
>>>
Please input a positive integer for factorization(>=2):98767654
98767654 equals 2 * 49383827
Further factorization over 2
2 is a prime number
Further factorization over 49383827
49383827 equals 17 * 2904931
Further factorization over 17
17 is a prime number
Further factorization over 2904931
2904931 equals 269 * 10799
Further factorization over 269
269 is a prime number
Further factorization over 10799
10799 is a prime number
98767654 is factorized into: [2, 17, 269, 10799]
>>>

 

posted on 2013-10-13 15:26  笨牛慢耕  阅读(2873)  评论(0)    收藏  举报

导航