Arithmetic Optimization Techniques for Hardware and Software Design