docs: public RandomVariableInterface addProduct(RandomVariableInterface factor1, RandomVariableInterface factor2) {
  		// Set time of this random variable to maximum of time with respect to which measurability is known.
  		double newTime = Math.max(Math.max(time, factor1.getFiltrationTime()), factor2.getFiltrationTime());
  
  		if(isDeterministic() && factor1.isDeterministic() && factor2.isDeterministic()) {
  			double newValueIfNonStochastic = valueIfNonStochastic + (factor1.get(0) * factor2.get(0));
  			return new RandomVariableLowMemory(newTime, newValueIfNonStochastic);
  		}
  		else if(isDeterministic() && !factor1.isDeterministic() && !factor2.isDeterministic()) {
  			double[] factor1Realizations = factor1.getRealizations();
  			double[] factor2Realizations = factor2.getRealizations();
  			double[] newRealizations = new double[Math.max(size(), factor1.size())];
  			for(int i=0; i<newRealizations.length; i++) {
  				newRealizations[i]		 = valueIfNonStochastic + factor1Realizations[i] * factor2Realizations[i];
  			}
  			return new RandomVariableLowMemory(newTime, newRealizations);
  		}
  		else if(!isDeterministic() && !factor1.isDeterministic() && !factor2.isDeterministic()) {
  			double[] factor1Realizations = factor1.getRealizations();
  			double[] factor2Realizations = factor2.getRealizations();
  			double[] newRealizations = new double[Math.max(size(), factor1.size())];
  			for(int i=0; i<newRealizations.length; i++) {
  				newRealizations[i]		 = realizations[i] + factor1Realizations[i] * factor2Realizations[i];
  			}
  			return new RandomVariableLowMemory(newTime, newRealizations);
  		}
  		else {
  			double[] newRealizations = new double[Math.max(Math.max(size(), factor1.size()), factor2.size())];
  			for(int i=0; i<newRealizations.length; i++) {
  				newRealizations[i]		 = get(i) + factor1.get(i) * factor2.get(i);
  			}
  			return new RandomVariableLowMemory(newTime, newRealizations);
  		}
  	}