It seems that in the second case, the `.reduce()`

method is the generic one which is just:

```
def reduce(self, f):
r"""
Return the reduction of the element of `f` modulo ``self``.
This is an element of `R` that is equivalent modulo `I` to `f` where
`I` is ``self``.
EXAMPLES::
sage: ZZ.ideal(5).reduce(17)
2
sage: parent(ZZ.ideal(5).reduce(17))
Integer Ring
"""
return f # default
```

If you want a better reduction in this particular case, you can put the polynomial in the quotient and lift it:

```
sage: R.<x>=PolynomialRing(ZZ)
sage: I = R.ideal(x^4)
sage: R.quotient(I)(x^8+1).lift()
1
```