Algunas optimizaciones podrían ser:
1) El primer while que tienes puedes poner la condición
que es lo mismo que
.
2) Porque haces 2 veces
??
3) Lo mismo que el primero, puedes reemplazar
por
en cada una de las veces que lo usas.
4) En las operaciones de la forma
puedes usar
y es lo mismo y más corto.
Eso es a grandes rasgos, no lo puedo mirar tan detallado por falta de tiempo pero un consejo más sería que lo modularices un poco, ya que así puedes hacer el código más mantenible, entiendes??
Un saludo