#!/usr/bin/env python# -*- coding: utf-8 -*-defisPrime(a):returnall(a%iforiinrange(2,a))# http://stackoverflow.com/a/14793082/562769deffactorize(n):factors=[]p=2whileTrue:whilen%p==0andn>0:# while we can divide by smaller number, do sofactors.append(p)n=n/pp+=1# p is not necessary prime, but n%p == 0 only for prime numbersifp>n/p:breakifn>1:factors.append(n)returnfactorsdefcalculateLegendre(a,p):""" Calculate the legendre symbol (a, p) with p is prime. The result is either -1, 0 or 1 >>> calculateLegendre(3, 29) -1 >>> calculateLegendre(111, 41) # Beispiel aus dem Skript, S. 114 -1 >>> calculateLegendre(113, 41) # Beispiel aus dem Skript, S. 114 1 >>> calculateLegendre(2, 31) 1 >>> calculateLegendre(5, 31) 1 >>> calculateLegendre(150, 1009) # http://math.stackexchange.com/q/221223/6876 1 >>> calculateLegendre(25, 1009) # http://math.stackexchange.com/q/221223/6876 1 >>> calculateLegendre(2, 1009) # http://math.stackexchange.com/q/221223/6876 1 >>> calculateLegendre(3, 1009) # http://math.stackexchange.com/q/221223/6876 1 """ifa>=pora<0:returncalculateLegendre(a%p,p)elifa==0ora==1:returnaelifa==2:ifp%8==1orp%8==7:return1else:return-1elifa==p-1:ifp%4==1:return1else:return-1elifnotisPrime(a):factors=factorize(a)product=1forpiinfactors:product*=calculateLegendre(pi,p)returnproductelse:if((p-1)/2)%2==0or((a-1)/2)%2==0:returncalculateLegendre(p,a)else:return(-1)*calculateLegendre(p,a)if__name__=="__main__":importdoctestdoctest.testmod()