```\nfunction removeLiquidity(uint256 LPamount, address outputToken, uint256 minOutputAmount)\n  external\n  onlyListedToken(outputToken)\n  override\n  returns (uint256 actualOutput)\n{\n  // Checks the initial balance of the token desired as output token\n  uint256 initialBalance;\n  if (outputToken == address(0)) {\n    initialBalance = address(this).balance;\n  } else {\n    initialBalance = IERC20(outputToken).balanceOf(address(this));\n  }\n\n  // Calculates intermediate variable F = (1-R)^16 and then the resulting output amount.\n  uint256 F_;\n  F_ = (1 << 64) - (LPamount << 64) / totalSupply();   // (1-R)      (0.64 bits)\n  F_ = F_ * F_;                                       // (1-R)^2    (0.128 bits)\n  F_ = F_ * F_ >> 192;                                // (1-R)^4    (0.64 bits)\n  F_ = F_ * F_;                                       // (1-R)^8    (0.128 bits)\n  F_ = F_ * F_ >> 192;                                // (1-R)^16   (0.64 bits)\n  actualOutput = initialBalance * ((1 << 64) - F_) >> 64;\n  require(actualOutput > minOutputAmount, "DFP: No deal");\n\n  // Burns the LP tokens and sends the output tokens\n  _burn(msg.sender, LPamount);\n  if (outputToken == address(0)) {\n    address payable sender = payable(msg.sender);\n    sender.transfer(actualOutput);\n  } else {\n    IERC20(outputToken).safeTransfer(msg.sender, actualOutput);\n  }\n\n  // Emitting liquidity removal event to enable better governance decisions\n  emit LiquidityRemoved(msg.sender, outputToken, actualOutput, LPamount);\n}\n```\n