#!/bin/env Python ################################################# # Pyderiv-0.1.py (Version 0.1) # # # # # # by Gabe Fierro # # # # # # # # # ################################################# from string import * import re def doubNegtoPos(derivedTerm): if '--' in derivedTerm: derivedTerm=derivedTerm.replace('--','') #print 'doubneg derivedTerm',derivedTerm return derivedTerm else: return derivedTerm def checkNeg(term): if term[0]=='-': global negTerm negTerm=True term=term[1:] return term else: negTerm=False return term def makeNeg(term): if negTerm==True: term='-'+term return term else: return term def expTerm(term): #x^2,-3x^4 term=checkNeg(term) #print 'checkneg',term const='' for char in term: if char.isdigit() == True: const=const+char #const=1, or 3 eterm=term[(term.index(char)+1):] #eterm=x^2 or x^4 if char.isdigit()==False: break if const=='': const='1' for char in term: if char=='^': exponent=term[(term.index(char)+1):] #print 'exponent',exponent coefficient=int(const)*int(exponent) #print 'coefficient',coefficient derivedTerm= makeNeg(str(coefficient)+'x^'+str(int(exponent)-1)) #print 'derivedTerm',derivedTerm return doubNegtoPos(derivedTerm) def EulerExpTerm(term): #for e^2x, -4e^-6x term=checkNeg(term) #print 'checkneg',term const='' #print 'term',term if term[0] =='e': term=term.replace('e','1e') for char in term: #print 'char',char if char.isdigit()==False: break if char.isdigit() == True: const=const+char #const=1, or 4 eterm=term[(term.index(char)+1):] #eterm=e^x,e^-6x #print 'eterm',eterm #print 'next eterm',eterm if const=='': const='1' if eterm[2:-1]=='': eterm=eterm.replace('x','1x') if eterm[2:-1]=='-': eterm=eterm.replace('-','-1') return doubNegtoPos(makeNeg(str(int(eterm[2:-1])*int(const))+eterm)) def rules(term): #regular expressions to detect something like "x^2" #check for ax^b if 'x' not in term: return '0' if 'x^' in term: #print 'x^term',term numOfX=0 for char in term: if char=='x': numOfX+=1 if numOfX==1: return expTerm(term) #check for ax ax=re.compile('[1-9]+x(?![^-])') matchx=ax.match(checkNeg(term)) if matchx: return term[:-1] #check for ae^bx if 'e^' in term: numOfX=0 for char in term: if char=='x': numOfX+=1 if numOfX==1: return EulerExpTerm(term) userequation=raw_input(":") #Get in the form of "x^2" or "e^2x" Not sure how to EquList=split(userequation,"+") derivList=[] derivative='' for term in EquList: #print 'term',term derivList.append(rules(term)) #print derivList for term in derivList: derivative=derivative+'+'+term print derivative[1:]