Let $r$ denote the APR we seek to establish, and the payments are made each $\frac{1}{n}$ of the year (i.e. $n=12$ for monthly payments, and $n=26$ for biweekly). Let $a_k$ be the principal amount of the loan at the beginning of the $k$-th period. Then $a_0 = a$, and $ a_{k+1} = a_k (1+r)^{1/n}-p $ Such a recurrence equation is not hard to solve using generating function technique, i.e. multiplying both sides of the equation with $x^k$ (for some indeterminate $x$) and forming $g(x) = \sum_{k=0}^\infty a_k x^k$: $\begin{eqnarray} \sum_{k=0}^\infty a_{k+1} x^k &=& (1+r)^{1/n} \sum_{k=0}^\infty a_k x^k - p \sum_{k=0}^\infty x^k \\ \frac{f(x)-a_0}{x} &=& (1+r)^{1/n} f(x) - p \frac{1}{1-x} \\ f(x) &=& \frac{1}{(1+r)^{1/n}-1} \left( \frac{p}{1-x} - \frac{a + p - a(1+r)^{1/n}}{1 - (1+r)^{1/n} x} \right) \\ a_{k} &=& \frac{1}{(1+r)^{1/n}-1} \left( p - \left( a + p - a (1+r)^{1/n} \right) (1+r)^{k/n} \right) \end{eqnarray} $ Requirement that after $m$ equal payments the loan is paid off gives the equation for effective annual percentage rate $r$: $ p = \left( a + p - a (1+r)^{1/n} \right) (1+r)^{m/n} $ As this is a non-linear equation, solving for $r$ will need to be done numerically. Here is a code in Mathematica:
In[63]:= FindAPR[a0_, p_, m_, n_] := Block[{sol}, sol = FindRoot[ p == (a0 + p - a0 (1 + r)^(1/n)) ((1 + r)^(m/n)), {r, 1/2}]; If[sol === {}, Indeterminate, r /. First[sol]]] In[64]:= FindAPR[1000, 256, 4 (* payments *), 12 (* paid monthly *)]*100 Out[64]= 12.0876
If the time to the first payment is different, $a_0$ needs to be replaced with different effective principal amount, $a_0^\ast = a_0 \left(1 + r \right)^{d/n}$, where $d$ is the length of the no-payment period given as a fraction of payment intervals. For example, if payments are made monthly $n=12$, there are 4 payments to be made $m=4$ in the amount of $p=\$260.00$ on the loan of $\$1000.00$ with 1 month no payment period, the effective APR is
In[3]:= FindAPR2[a0_, p_, m_, n_, d_] := Block[{sol}, sol = FindRoot[ p == (p - a0 (1 + r)^(d/n) ( (1 + r)^(1/n) - 1)) ((1 + r)^(m/ n)), {r, 1/2}]; If[sol === {}, Indeterminate, r /. First[sol]]] In[5]:= FindAPR2[1000, 260, 4, 12, 1]*100 Out[5]= 14.4241